您可以将实例命名为与其构造函数名称相同的名称吗?
var myFunc = new function myFunc(){};
?
看起来,这用新实例替换了函数对象......这意味着这是一个很好的单例。
我还没有看到有人使用它,所以我想,这有一些我不知道的缺点......
有什么想法吗?
您可以将实例命名为与其构造函数名称相同的名称吗?
var myFunc = new function myFunc(){};
?
看起来,这用新实例替换了函数对象......这意味着这是一个很好的单例。
我还没有看到有人使用它,所以我想,这有一些我不知道的缺点......
有什么想法吗?
是的...
但是,您正在创建一个命名函数但从不按名称引用它,这看起来确实很奇怪。
我见过的更常见的模式是
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;
}
};
})();
免责声明
现在是否应该使用单例模式,这是另一个问题(如果您关心测试、依赖管理、可维护性、可读性,答案是否定的)
看起来,这用新实例替换了函数对象
不,它不会取代任何东西。函数表达式的名称(这就是你所拥有的)只能在函数本身内部访问,而不是在它外部。这与省略名称完全相同:
var myFunc = new function(){};
通常,如果您不希望某些符号可访问,请不要将它们设为全局。在函数中定义这些符号,然后返回您想要访问的任何内容,例如:
var myobj = (function() {
function Foo() {};
// do whatever
return new Foo();
}());
但是,如果您只想创建单个对象,则使用对象字面量通常更容易:
var myobj = {};
如果您只想从中创建单个实例,则没有理由使用构造函数。如果要建立继承,可以使用Object.create
[MDN]