以这两种方式创建对象有什么区别?

时间:2013-02-26 08:39:40

标签: javascript object prototypal-inheritance

我想创建一个包含许多实例的对象。这两种方式有什么区别?

function anObject(foo,bar){
   this.foo = bar;
   yada yada
};

和这个

var anObject = function(foo, bar){
   var foo;
   var bar;
   this.something = function...
}

1 个答案:

答案 0 :(得分:0)

我强烈推荐对象构造函数模式(第一个示例)覆盖模式(第二个示例),用于您期望大量的对象。构造函数模式只会创建一个对象,一个具有foo属性的对象。如果你想要一个方法,你可以将方法添加到构造函数原型中:

anObject.prototype.something = function () {
    // do something
}

其中使用构造函数模式将分配至少三个对象。举个例子,

function anObject(foo, bar) {
    this.something = function () {
        // do something
    };
}

这将创建三个紧密耦合的对象。它将创建包含名为something的属性的对象,然后存储在调用anObject时创建的新函数对象,第三,它将创建包含foo和{{的函数环境1}}。此表单的优点是barfoo不能访问除bar以外的任何内容,但它需要两个额外的分配,比构造函数模式的价格大约高出三倍,尽管现代引擎优化,你的milage可能会有所不同。您添加的功能越多,分配就越差,每个功能添加一个额外的分配。使用构造函数模式,方法分配由每个对象通过原型链共享,并且内存效率更高。