到目前为止,我一直在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;
}