0%

object.create()和new区别

Object.create()

1
2
3
4
5
6
Object.creat=function(o){
var F=function(){};
F.prototype=o;
return new F();

}

内部定义一个新对象,并且让F.prototype对象赋值为引进的对象/函数o,并return一个新的对象

new

1
2
3
4
5
6
7
function(o,...args){
var o1={};
o1.__proto__=o.prototype;
var res=o.call(o1,args);
return res typeof Object?res:o1;

}

区别:

1
2
3
4
5
6
7
8
var Base=function(){
this.a=2;

}
var o1=new Base();
var o2=Object.create(Base);
console.log(o1.a);//2
console.log(o2.a);//undefined

Object.create失去了原来对象属性的访问:F创建后函数调用结束后被销毁,o2直接指向Base构造函数,o2没有指向它的prototype,因此o2.consructor不能通过prototype对找到构造函数,所以是undefined,但是如果Base是一个对象,则o2.a值为2,因为o2的[[Prototype]]指向了对象Base

1
2
3
4
5
6
7
8
var Base = function () {
this.a = 2
}
Base.prototype.a = 3;
var o1 = new Base();
var o2 = Object.create(Base);
console.log(o1.a); // 2
console.log(o2.a); // undefined

这里Base.prototype.a会去找它的[[Prototype]]上看是否有a,没有就重新设置了一个a,值为3,**而实际上o1.constructor通过默认的[[Prototype]]委托指向Base.prototype,进而委托到constructor指向的构造函数。所以这里的o1.a=2;o2.a仍旧是undefined,因为o2直接指向的是Base,没有指向它的prototype

小结

小结

比较 new Object.create
构造函数 保留原构造函数属性 丢失原构造函数属性
原型链 原构造函数prototype属性 原构造函数/(对象)本身
作用对象 function function和object