闭包对象创建:这两种方法的优点/缺点是什么

Closure Object Creation: What are the advantages/disadvantages of these two approaches?

本文关键字:缺点 是什么 方法 创建 对象 两种 闭包      更新时间:2023-09-26

我见过这两种创建带有闭包的js对象的方法,但不确定使用一种方法是否比另一种方法有任何优势:

1.)使用新的

var myObject = new function() {
    // ...
    this.foo = 'bar';
};

2.)使用自执行匿名

var myObject = (function() {
    // ...
    return {
        foo: 'bar'
    };
} ());

我读过一些关于方法1需要分配this的开销的文章,但我不确定这一说法是否与方法2类似,或者与不返回的自执行匿名函数相比。

就我个人而言,我认为第一个语法看起来更易于维护,但这可能只是个人偏好。

第一条语句提供了一个完整的Object实例-尽管这是唯一可能的实例,因为构造函数可以使用一次-第二条语句提供一个对象文本。在这种情况下,我看不出有多大区别,两者都可以称为"一次性实例模式"。第一种模式(对我来说)的唯一优势是我的编辑器(KomodoEdit 6.1)可以使用intellisense(它识别myObject并"知道"它的属性)。也许第一种模式的另一个优点是可以为其定义原型方法(如果您命名匿名函数):

var myObject = new function myObj() {
    this.foo = 'bar';
    myObj.prototype.getFoo = function() { return this.foo; }
    myObj.prototype.setFoo = function(v){ this.foo = v || this.foo; return this; }
};

但这可能不适用于所有浏览器。

我最终进行了一些进一步的搜索,并在比较几种实例化方法时发现了这一点:

http://jsperf.com/new-vs-literal/4

似乎使用new function() {};模式的明显较慢