您可以将实例命名为与构造函数名称相同吗?
var myFunc = new function myFunc(){};
看起来,这会将Function对象替换为新实例...这意味着这是一个很好的Singleton。
我没有看到有人使用过这个,所以我猜,这有些缺点我不知道......
有什么想法?
答案 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]