10

new到目前为止,我一直在 JavaScript 中使用关键字。我一直在阅读Object.create,我想知道是否应该改用它。我不太明白的是我经常需要运行构造代码,所以我根本不知道Object.create它会如何工作,因为它不会触发任何函数运行。

谁能告诉我,在哪种情况下我应该使用Object.create而不是new

4

4 回答 4

14

到目前为止,如果你想创建一个对象,你只能使用字面量:

var obj = {};

Object构造函数。

var obj = Object();

但是这些方法都不能让您指定创建对象的原型

这是你Object.create现在可以做的。它允许您创建一个新对象并将第一个参数设置为新对象的原型。此外,它允许您设置作为第二个参数提供的新对象的属性。

它类似于做这样的事情(没有第二个参数):

function create(proto) {
    var Constr = function(){};
    Constr.prototype = proto;
    return new Constr();
}

因此,如果您使用与此类似的构造,则当您想使用Object.create.

它不能替代new. 它更多的是使创建应该从另一个对象继承的单个对象更简单。

例子:

我有一个对象a

var a = {
   someFunction: function() {}
};

我想b扩展这个对象。然后你可以使用Object.create

b = Object.create(a);
b.someOtherFunction = function(){};

每当你有一个构造函数,但你只从它实例化一个对象时,你可以用Object.create.

有适用的一般规则。这在很大程度上取决于构造函数正在做什么以及如何从其他对象继承等。

于 2011-07-07T15:46:01.853 回答
3

如前所述,Object.create()当您想要一种简单的方法来设置新对象的原型时,通常使用它。但是,其他答案没有提到的是,构造函数(需要 new)与任何其他函数并没有什么不同。

事实上,任何函数都可以返回一个对象,在 JavaScript 中很常见看到工厂函数(像构造函数,但它们不需要new,或者使用this来引用新对象)。工厂函数经常Object.create()用来设置新对象的原型。

var barPrototype = {
  open: function open() { /* ... */ },
  close: function close() { /* ... */ },
};
function createBar() {
  return Object.create(barPrototype);
}

var bar = createBar();
于 2013-02-10T13:00:57.627 回答
3

这个线程超级晚了..但我认为需要做出的一个重要区别是,虽然构造函数只是函数,但 new 运算符调用函数并捕获生成的对象,这在动态环境中很有用。它还允许在构造函数执行期间引用属性和方法,这取决于具体情况可能有用也可能没用。如果您更关心有一个设置原型但对象本身比不更静态,那么 Object.create 将是一个更好的选择,因为它更干净并且不会像 new 运算符那样以意想不到的方式混淆原型链.

一些简单的例子..

var Foo = function(element) {
  this.elem = element;
  $(this.elem).css('color', 'blue');
  // using the new operator here gives access to this.elem
  // immediately after that declaration is made, thus providing 
  // a comfortable dynamic system to work with 
}

var bar = new Foo(someElem);

相对于..

var foo = {
  elem : element,             // assume elem exists
  $(this.elem).css('color', 'blue')// in the lexical scope
}

var bar = Object.create(foo);
// This.elem does not exist until the object is returned now
// and the .css method call will not execute

应该更清楚为什么要使用一个而不是另一个,作为另一个简单的细分......

当您关心拥有动态对象而不关心原型链时,请使用 New

当您不太关心动态性而更关心具有显式原型链时,请使用 Object.create。我还将注意到,使用 Object.create 制作的对象也可以通过使用一种名为的方法动态构建init,您可以构建该方法以根据您的需要分配属性,并在新返回的对象上简单地调用它。

每种方法都有其起伏,但在我看来它们的用例是相当不同的。但是,您很可能会发现自己在使用 Object.create,因为大多数情况都需要较少动态的情况,并且更需要继承。

于 2016-10-17T15:47:17.500 回答
1

Object.create() 函数的确切源代码是:

function Object.Create(proto, propertiesObject)
{
    var obj = {};

    Object.setPrototypeOf(obj, proto);

    if(propertiesObject)
    {
        Object.defineProperties(obj, propertiesObject);
    }

    return obj;
}
于 2017-08-23T08:36:58.303 回答