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

时间:2013-04-16 17:58:26

标签: javascript constructor singleton instance

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

var myFunc = new function myFunc(){};

看起来,这会将Function对象替换为新实例...这意味着这是一个很好的Singleton。

我没有看到有人使用过这个,所以我猜,这有些缺点我不知道......

有什么想法?

2 个答案:

答案 0 :(得分:1)

... YES

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

我见过的更常见的模式是

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;
        }
    };     
})();

<强>声明

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

答案 1 :(得分:0)

  

看起来,这会将Function Object替换为新实例

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

 var myFunc = new function(){};

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

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

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

var myobj = {};

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