有没有理由在JavaScript中使用Object.create()或new?

时间:2011-07-07 15:41:10

标签: javascript ecmascript-5 object-create

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

有人能告诉我,在哪种情况下,我应该使用Object.create代替new吗?

4 个答案:

答案 0 :(得分:13)

到目前为止,如果要创建对象,则只能使用文字:

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替换它。

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

答案 1 :(得分: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();

答案 2 :(得分:3)

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

一些简单的例子..

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,因为大多数情况会调用不太动态的情况并且需要继承。

答案 3 :(得分:0)

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

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

    Object.setPrototypeOf(obj, proto);

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

    return obj;
}