理解Object.create()和新SomeFunction()之间的区别

理解Object.create()和新SomeFunction()之间的区别

我最近偶然发现Object.create()方法,并试图推断它与创建对象的新实例有何不同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/


阿晨1998
浏览 489回答 3
3回答

慕姐4208626

在Object.create中使用的对象实际上构成了新对象的原型,其中与新函数()形式一样,声明的属性/函数并不构成原型。是,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方法,不是克罗克福德的垫子。该方法已开始在最新的浏览器上进行本机实现,请检查兼容性表.

至尊宝的传说

很简单的说,new X是Object.create(X.prototype)通过额外运行constructor功能。(并给予constructor有机会return应该是表达式的结果的实际对象,而不是this.)就这样。*)其余的答案都是令人困惑的,因为显然没有其他人读到new也一样。;)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript