我正在创建一个对象文字,我将其用作命名空间.对象文字(命名空间)碰巧包含构造函数MyConstructor.我想在对象文字中扩展MyConstructor的原型.如果我将MyConstructor的声明拉出来并将其放在myNamespace的声明之上,那么一切都很好,除了myConstructor不再被myNamespace命名.如何最好地使这项工作?由于
'' ,以下无法编译.在这一行:
MyConstructor.prototype = {
Run Code Online (Sandbox Code Playgroud)
下面提供了对象文字.
谢谢,迈克
var myNamespace = {
a: 3,
b: function (msg) {
alert(this.a);
},
MyConstructor: function(xx) {
this.x = xx;
},
MyConstructor.prototype = {
a: 1,
b: function() {
return true;
}
}
};
Run Code Online (Sandbox Code Playgroud)
更新:已接受的解决方案有效.但是,我的问题的前提是有缺陷的.在这种情况下,我根本不会使用对象文字,因为我发现单元测试更难.相反,我会使用由构造函数创建的普通对象,并将私有对象放在其中.另一件事是,"自我/立即执行的功能",虽然在某些方面很漂亮,但对新手来说有点难以解释.
你根本无法在对象文字中做到这一点.抱歉.
至于解决它的方法,使用函数来创建你的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;
}());
Run Code Online (Sandbox Code Playgroud)
所以这里发生的是myNamespace被设置为一个立即调用的函数的值,并返回你所追求的实际命名空间对象.没有其他代码可以访问函数中的内容,但由于它在函数内部,您可以执行任何操作,而不仅仅是对象文字.这解决了你的问题;)
只需使用命名空间
var myNamespace = {
myConstructor: function( x ) {
this.x = x;
}
}
myNamespace.myConstructor.prototype = {
//...
}
Run Code Online (Sandbox Code Playgroud)
或另一种变化
var myNamespace = (function(){
function myConstructor(){}
myConstructor.prototype = {};
return {
myConstructor: myConstructor
}
})();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1885 次 |
| 最近记录: |