返回

Object.create() 与 new 的区别

我们先看一下二者具体做了些什么:

new Test():

  • create new Object() obj
  • set obj.proto to Test.prototype
  • return Test.call(obj) || obj;

最后一步如果构造函数未返回对象,则将该新对象返回,即this,如返回了对象,则替换this。

Object.create( Test.prototype )

  • create new Object() obj
  • set obj.proto to Test.prototype
  • return obj;

所以说二者区别: new X= Object.create( X.prototype )+ X.constructor()

看下面一个例子:

function Dog1(name){
   return {dogName: name};
}

function Dog2(name){}

Dog1.prototype.setName = Dog2.prototype.setName = function(name){
    this.name = name;
};

let pet1 = new Dog1('rocky'); 
console.log(pet1.dogName);           //rocky  
pet1.setName('skye');                //error

pet1 = new Dog2();
pet1.setName('skye');
console.log(pet1.name);              //skye            

let pet2 = Object.create(Dog1.prototype);
pet2.setName('skye');                //ok
console.log(pet2.name);              //skye
console.log(pet2.dogName);           //undefined

Dog1方法返回一个对象,所以替换了this,而我们使用Dog2就能访问原型上的方法了。

参考文章: Understanding the difference between Object.create() and new SomeFunction()