1.通过字面量来创建对象
var o = {
name: 'zs',
age: 18,
sex: true,
sayHi: function () {
console.log(this.name);
}
};
//其实这种方法内部会自动调用new Object()方法来创建对象
//obj就是一个最简单的对象
var obj = {}; //
console.log(typeof(obj));
作为一个对象应该具备的基本信息
//属性和行为
//创建一个带有属性和行为对象
var obj = {
name:"张三",
age:18,
height:180,
eat:function(){
console.log(this.name+"在吃饭");
},
sleep:function(){
console.log("在睡觉");
}
};
console.log(obj);
访问对象的信息
console.log(obj.name,obj.age,obj.height);
obj.eat();
2.通过new Object()创建对象
var person = new Object();
person.name = 'lisi';
person.age = 35;
person.job = 'actor';
person.sayHi = function(){
console.log('Hello,everyBody');
}
//缺点:每创建一个对象都要写一堆代码,太麻烦
<script>
//Object 东西
//Object 是js中的一个最顶层的函数
var obj1 = new Object();
//给obj这个对象赋值
obj1.name = "张三";
obj1.age = 18;
obj1.eat = function(){
console.log("吃饭");
}
//获取obj这个对象的信息
console.log(obj1.name);
console.log(obj1.age);
obj1.eat();
var obj2 = new Object();
//给obj这个对象赋值
obj2.name = "张三";
obj2.age = 18;
obj2.eat = function(){
console.log("吃饭");
}
//获取obj这个对象的信息
console.log(obj2.name);
console.log(obj2.age);
obj2.eat();
</script>
3.通过工厂函数创建对象
function createPerson(name, age, job) {
var person = new Object();
person.name = name;
person.age = age;
person.job = job;
person.sayHi = function(){
console.log('Hello,everyBody');
}
return person;
}
var p1 = createPerson('张三', 22, 'actor');
//缺点:无法判断所创建出来的对象的具体类型 instanceof
<script>
//面向对象三大特性:
//封装 继承 多态
//在js中 封装肯定有
//在js中 继承不按套路出牌,不是纯面向对象的继承方式
//在js中 多态就谈不上了
function creatPerson(name,age,eat){
var obj = new Object();
//给obj这个对象赋值
obj.name = name;
obj.age = age;
obj.eat = eat;
return obj;
}
var p1 = creatPerson("张三",18,function(){console.log("在吃饭");})
var p2 = creatPerson("李四",28,function(){console.log("在吃饭");})
console.log(p1.name,p2.name);
p1.eat();
p2.eat();
//但是这种方式也有缺陷
console.log(typeof(p1));
console.log(typeof(p2));
//instanceof : 可以判断一个对象是否是指定类型对象
console.log(p1 instanceof Object); //true
console.log(p2 instanceof Object); //true
console.log(p1 instanceof Array); //false
</script>
4.自定义构造函数创建对象
//构造函数首字母大写
//自定义构造函数----->实例化对象
function Person(name,age,job){
this.name = name;
this.age = age;
this.job = job;
this.sayHi = function(){
console.log('Hello,everyBody');
}
}
//构造函数---->创建对象
var p1 = new Person('张三', 22, 'actor');
//p1.sayHi();
//实例对象是通过构造函数来创建
//把这个对象的结构显示出来
console.dir(p1);
console.dir(Person);
//实例对象的构造器(构造函数)
//实例对象的构造器是指向Person的,结果是true,所以,这个实例对象p1就是通过Person来创建的
console.log(p1.constructor==Person);//
//判断这个对象是不是这种数据类型
//console.log(dog.constructor==Animal);
//console.log(dog instanceof Person);
//好处:既封装了内部实现,又能通过instanceof来判断所创建出来对象的具体类型
<script>
//1.构造方法也是一个函数
//1.1 普通方法 普通的方法方法名怎么写?驼峰命名法 动宾结构
function sayHello(){
}
//1.2 Person构造方法 方法名首字母大写
function Person(name,age,gender){
this.name = name;
this.age = age;
this.gender = gender;
}
//如何根据构造方法来创建对象呢?
var p1 = new Person("张三",18,"男");
//1.3 Animal构造方法 方法名首字母大写
function Animal(name,host,gender){
this.name = name;
this.host = host;
this.gender = gender;
}
var a1 = new Animal("大黄","轮胎","公");
//1.4 判断两个对象的类型
console.log(p1 instanceof Object);
console.log(a1 instanceof Object);
console.log(p1 instanceof Person);
//因为p1是Person这个构造函数创建出来的。所以p1是Person类型的对象
console.log(p1 instanceof Animal);
//因为p1不是Animal这个构造函数创建出来的。所以p1不是Animal类型的对象
console.log(p1);
</script>
构造函数创建对象带来的问题
function Person(name,age) {
this.name=name;
this.age=age;
this.eat=function () {
console.log("今天吃红烧土豆");
}
}
var per1=new Person("小白",20);
var per2=new Person("小黑",30);
console.dir(per1.eat == per2.eat);
//上面的打印结果为false,每个对象的信息不共享