5

您可以将实例命名为与其构造函数名称相同的名称吗?

var myFunc = new function myFunc(){};

?

看起来,这用新实例替换了函数对象......这意味着这是一个很好的单例。

我还没有看到有人使用它,所以我想,这有一些我不知道的缺点......

有什么想法吗?

4

2 回答 2

1

是的...

但是,您正在创建一个命名函数但从不按名称引用它,这看起来确实很奇怪。

我见过的更常见的模式是

function MyClass(){
    this.val = 5;
};
MyClass.prototype.getValue = function() {
    return this.val;
}
MyClass = new MyClass();

但是当人们这样做时,我想知道为什么他们不只使用文字对象

var MyClass = {
    val: 5,
    getValue: function() {
        return this.val;
    }
}

我什至更愿意在这里使用模块模式

var MyClass = (function(){
    var val = 5;
    return {
        getValue: function() {
            return val;
        }
    };     
})();

免责声明

现在是否应该使用单例模式,这是另一个问题(如果您关心测试、依赖管理、可维护性、可读性,答案是否定的)

于 2013-04-16T18:01:31.110 回答
0

看起来,这用新实例替换了函数对象

不,它不会取代任何东西。函数表达式的名称(这就是你所拥有的)只能在函数本身内部访问,而不是在它外部。这与省略名称完全相同:

 var myFunc = new function(){};

通常,如果您不希望某些符号可访问,请不要将它们设为全局。在函数中定义这些符号,然后返回您想要访问的任何内容,例如:

var myobj = (function() {
    function Foo() {};
    // do whatever
    return new Foo();
}());

但是,如果您只想创建单个对象,则使用对象字面量通常更容易:

var myobj = {};

如果您只想从中创建单个实例,则没有理由使用构造函数。如果要建立继承,可以使用Object.create [MDN]

于 2013-04-16T18:09:12.707 回答