一尘不染

了解Object.create()和new SomeFunction()之间的区别

javascript

最近,我偶然发现了Object.create()JavaScript中的方法,并试图推断该方法与使用创建对象的新实例有何不同new SomeFunction(),以及何时要使用一个实例。

考虑以下示例:

var test = {

  val: 1,

  func: function() {

    return this.val;

  }

};

var testA = Object.create(test);



testA.val = 2;

console.log(test.func()); // 1

console.log(testA.func()); // 2



console.log('other test');

var otherTest = function() {

  this.val = 1;

  this.func = function() {

    return this.val;

  };

};



var otherTestA = new otherTest();

var otherTestB = new otherTest();

otherTestB.val = 2;

console.log(otherTestA.val); // 1

console.log(otherTestB.val); // 2



console.log(otherTestA.func()); // 1

console.log(otherTestB.func()); // 2

请注意,在两种情况下都观察到相同的行为。在我看来,这两种情况之间的主要区别是:

  • Object.create()实际上,中使用的对象构成了新对象的原型,而在new Function()声明的属性/函数中,并没有形成原型。
  • 您不能Object.create()像使用函数语法那样使用语法创建闭包。给定JavaScript的词法(与块)类型范围,这是合乎逻辑的。

以上说法正确吗?我想念什么吗?您什么时候可以使用另一个?


阅读 490

收藏
2020-04-25

共1个答案

一尘不染

Object.create中使用的对象实际上构成了新对象的原型,而与newFunction()一样,声明的属性/函数不构成原型。

是的,Object.create构建一个对象,该对象直接从作为其第一个参数传递的对象继承。

使用构造函数,新创建的对象将从构造函数的原型继承,例如:

var o = new SomeConstructor();

在上面的示例中,o直接继承自SomeConstructor.prototype

这里有一个区别,另一方面,Object.create您可以创建一个不继承任何对象的对象,Object.create(null);另一方面,如果您设置SomeConstructor.prototype = null;了新创建的对象将继承自的对象Object.prototype

您不能像使用功能语法那样使用Object.create语法创建闭包。给定JavaScript的词法(与块)类型范围,这是合乎逻辑的。

好了,您可以创建闭包,例如使用属性描述符参数:

var o = Object.create({inherited: 1}, {
  foo: {
    get: (function () { // a closure
      var closured = 'foo';
      return function () {
        return closured+'bar';
      };
    })()
  }
});

o.foo; // "foobar"

请注意,我在谈论的是ECMAScript 5th Edition Object.create方法,而不是Crockford的shim。

2020-04-25