问题描述:
- 创建对象有几种方法
- 原型,构造函数,对象实例,原型链
- instanceof原理
- new运算符,工作原理
创建对象的方法:
var obj={name:'andy'} //字面量创建对象,默认原型指向Object,所以两个可以划分为一类
var obj=new Object({name:'andy'})
//Object({name:'andy'})
//使用显式的构造函数创建对象
var OBJ=function(){
this.name="andy"
}
var o=new OBJ()
//OBJ
var P={name:'andt'}
var obj=Object.create(P)
OBJECT{}
原型,构造函数,实例,原型链:
- 实例:obj1,obj2,obj3
- 构造函数:new 后面的函数,即使没有this
- 原型链:通过prototye(构造函数)和proto(原型对象)层层向上寻找prototype,顶端是Object.prototype终止
- OBJ.proto==Function.prototype
instanceof:
实例对象._protoinstanceof
构造函数.prototype
new 运算符:
- 一个新的空对象被创建。继承自构造函数的原型对象
var foo=function(){this.name="ang"}
var f=new foo()//创建空对象f,继承自foo.prototype
- 构造函数foo被执行。执行的时候,相应的传参会被传入,同时上下文(this)会被指定为这个新实例
- 如果构造函数返回了一个”对象”,那么这个对象会取代整个new出来的结果,如果构造函数没有返回对象,则new出来的结果为步骤11创建的对象
//模拟new过程
var new2=function(func){
//创建空对象,空对象关联构造函数的原型对象
var o=Object.create(func.prototype)
//执行构造函数
var k=func.call(o)
//判断构造函数的运行结果是不是对象类型
if(typeof k == 'object'){
return k
}
else{
return o
}
}