ecmascript 5 -在JavaScript中使用Object.create()或new有什么理由吗?

ecmascript 5 - Is there any reason to use Object.create() or new in JavaScript?

本文关键字:new 什么 理由 create JavaScript Object ecmascript      更新时间:2023-09-26

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

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

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

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来代替它。

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

如前所述,当您需要一种简单的方法来设置新对象的原型时,通常使用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();

这个帖子太迟了。但我认为需要做的一个重要区别是,虽然构造函数只是函数,但new操作符调用函数并捕获结果对象,这在动态环境中可能很有用。它还允许在构造函数执行期间引用属性和方法,这取决于具体情况,可能有用,也可能没用。如果你更关心的是有一个固定的原型,但对象本身是静态的,对象。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也可以通过使用一个名为init的方法来动态构建,您可以根据需要构建该方法来分配属性,并只需在新返回的对象上调用它。

每种方法都有它的起起落落,但是它们的用例在我看来是相当不同的。然而,您很可能会发现自己在使用Object。在大多数情况下,创建将需要较少的动态情况,并且更需要继承。

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

function Object.Create(proto, propertiesObject)
{
    var obj = {};
    Object.setPrototypeOf(obj, proto);
    if(propertiesObject)
    {
        Object.defineProperties(obj, propertiesObject);
    }
    return obj;
}