首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >理解Object.create()和new SomeFunction()之间的区别

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

Stack Overflow用户
提问于 2010-11-13 00:12:39
回答 11查看 144.4K关注 0票数 422

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

考虑以下示例:

代码语言:javascript
复制
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/

EN

回答 11

Stack Overflow用户

回答已采纳

发布于 2010-11-13 00:22:30

在Object.create中使用的对象实际上形成了新对象的原型,而在

()表单中,声明的属性/函数并不形成原型。

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

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

代码语言:javascript
复制
var o = new SomeConstructor();

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

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

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

嗯,你可以创建闭包,例如使用属性描述符参数:

代码语言:javascript
复制
var o = Object.create({inherited: 1}, {
  foo: {
    get: (function () { // a closure
      var closured = 'foo';
      return function () {
        return closured+'bar';
      };
    })()
  }
});

o.foo; // "foobar"

请注意,我说的是ECMAScript第五版Object.create方法,而不是克罗克福德的垫片。

该方法开始在最新的浏览器上实现,请查看此compatibility table

票数 254
EN

Stack Overflow用户

发布于 2013-07-31 00:12:53

非常简单地说,new X是额外运行constructor函数的Object.create(X.prototype)。(并使constructor有机会return应该是表达式结果的实际对象,而不是this。)

就这样。:)

剩下的答案是令人困惑的,因为显然也没有其他人阅读new的定义。;)

票数 477
EN

Stack Overflow用户

发布于 2013-01-30 07:23:33

以下是两个调用在内部执行的步骤:

(提示:唯一的区别在于第3步)

new Test()

  1. create new Object() obj
  2. obj.__proto__设置为create

Object.create( Test.prototype )

  1. create new Object() obj
  2. obj.__proto__设置为create

所以基本上Object.create不会执行构造函数。

票数 217
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4166616

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档