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);console .log(o2.a);
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); console .log(o2.a);
这里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