我正在创建一个对象文字,我将其用作命名空间。对象文字(命名空间)碰巧包含构造函数MyConstructor。我想在对象文字中扩展MyConstructor的原型。如果我将MyConstructor的声明拉出来并将其放在myNamespace的声明之上,那么一切都很好,除了myConstructor不再被myNamespace命名。如何最好地使这项工作?以下无法编译,因为
'。'在这一行:
MyConstructor.prototype = {
下面提供的对象文字。
谢谢, 麦克
var myNamespace = {
a: 3,
b: function (msg) {
alert(this.a);
},
MyConstructor: function(xx) {
this.x = xx;
},
MyConstructor.prototype = {
a: 1,
b: function() {
return true;
}
}
};
更新:已接受的解决方案有效。但是,我的问题的前提是有缺陷的。在这种情况下,我根本不会使用对象文字,因为我发现单元测试更难。相反,我会使用由构造函数创建的普通对象,并将私有对象放在其中。另一件事是,“自我/立即执行的功能”,虽然在某些方面很漂亮,但对新手来说有点难以解释。
答案 0 :(得分:5)
你根本不能在对象文字中这样做。遗憾。
至于解决方法,请使用函数创建myNamespace
。这样它就不必是文字,但你仍然可以获得命名空间的效果:
var myNamespace = (function(){
var ns = {
a: 3,
b: function (msg) {
alert(this.a);
},
MyConstructor: function(xx) {
this.x = xx;
}
};
ns.MyConstructor.prototype = {
a: 1,
b: function() {
return true;
}
return ns;
}());
所以这里发生的是myNamespace设置为立即调用的函数的值,并返回您所追求的实际命名空间对象。没有其他代码可以访问函数中的内容,但由于它在函数内部,您可以执行任何操作,而不仅仅是对象文字。这解决了你的问题;)
答案 1 :(得分:5)
只需使用命名空间
var myNamespace = {
myConstructor: function( x ) {
this.x = x;
}
}
myNamespace.myConstructor.prototype = {
//...
}
或其他变体
var myNamespace = (function(){
function myConstructor(){}
myConstructor.prototype = {};
return {
myConstructor: myConstructor
}
})();
答案 2 :(得分:0)
如何创建一个返回MyConstructor的生成器函数。如果你创建一个名为createMyConstructor的函数,然后立即调用它,它将返回你想要的。
var myNamespace = {
a: 3,
b: function (msg) {
alert(this.a);
},
MyConstructor: (function createMyConstructor() {
var cons = function(xx) {
this.x = xx;
};
cons.prototype = {
a: 1,
b: function() {
return true;
};
return cons;
})()
};