小编典典

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

all

我最近偶然发现了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 的词法(vs 块)类型范围,这是合乎逻辑的。

上述说法是否正确?我错过了什么吗?您什么时候会使用其中一种?

编辑:链接到上述代码示例的 jsfiddle 版本:http:
//jsfiddle.net/rZfYL/


阅读 89

收藏
2022-03-21

共1个答案

小编典典

Object.create 中使用的对象实际上形成了新对象的原型,而在 new Function() 形式中,声明的属性/函数不形成原型。

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

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

var o = new SomeConstructor();

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

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

您不能像使用函数式语法那样使用 Object.create 语法创建闭包。考虑到 JavaScript 的词法(vs 块)类型范围,这是合乎逻辑的。

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

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

o.foo; // "foobar"

请注意,我说的是 ECMAScript 第 5 版Object.create方法,而不是 Crockford 的 shim。

该方法开始在最新的浏览器上本地实现,请检查此兼容性表

2022-03-21