1、对象的定义: 在JavaScript中,对象是以键值对为元素的无序复合数据集合。
2、创建对象的3种方式:
2-1: 通过字面量,如:
var obj = {
a: '七鸽',
cando:function(){}
}
JavaScript允许属性后绑定,也就说在创建对象的时候,不需要定义好属性。可以在任何时候给对象新增属性。以上代码等价于以下代码,如:
var obj={}
obj.a='七鸽'
obj.cando=function(){}
2-2: 通过Object.create()创建对象,create方法可以接收2个参数,第一个参数,表示以第一个参数为对象原型,第二参数,可选,不填表示创建空对象,填写表示创建一个以该对象属性为元素的对象:
var obj1={}
var obj2=Object.create({})
var obj3=Object.create(Object.prototype)
//obj1、obj2、obj3这个3对象是完全等价的
var obj4={a:'七鸽'}
var obj5=Object.create({},obj4)
var obj6=Object.create(Object.prototype,obj4**)**
2-3:通过new 关键字创建对象
function Car() {
this.color = 'red'
}
var car = new Car;//等价于var car = new Car()
3、通过new关键字创建对象,this是什么 ,new关键字有做了什么呢?
3-1:在new Car执行之前,Car构造函数进行预编译,JS擎根据new关键字调用函数,就在该函数的内部,通过Object.create({})生成一个空对象,用this来保存这个对象, 并且通过this.proto.constructor=arguments.callee来添加一个构造器,指向当前函数,Car函数的执行期上下文AO如下:
AO={
this:{}
}
Go:{
car:undefined
}
3-2:Car函数开始执行,通过属性后绑定的方式给this对象添加color属性,,此时执行期上下文的AO如下:
AO={
this:{color:'red}
}
3-3: Car数执行完之后,返回this对象的引用地址赋值给变量car,此时GO:
Go:{
car:this
}
3-4: 由于this是JavaScript的关键字,以下代码通过that来代替this。以下代码通过函数的普通调用,模拟new关键字执行构造函数的过程:
function Car() {
var that = Object.create({});
that.__proto__.constructor = arguments.callee;
that.color = 'red'
return that
}
var car2 = Car()
3-5 通过以上代码,可以知道,JS引擎跟new 关键字为程序员做的3件事:
1、 创建一个继承Object的空对象this;
2、 给这个this对象的原型__proto__添加一个构造器,指向当前函数;
3、 把this对象的引用地址返回给调用者。