是的,因为你不能在对象声明中使用这种类型的链式调用
obj.prototype或obj.something在此处,因为语言将obj视为非对象值。您可以通过以下方式模拟此效果
Namespace = {};
Namespace.obj =function() {
this.foo="bar";
};
Namespace.obj.prototype.start = function(tabinst) {
this.foo="fubar";
};
console.log( Namespace.obj.prototype );
(请参见此示例
http://jsfiddle.net/WewnF/ )
编辑:哇,我刚刚注意到我说的已经在问题中了。很抱歉没有早点注意到这一点……你所描述的方式是实现这一目标的正确方法。
否则,您可以像这样重新编写代码,但不完全符合您的要求,并且不能起到相同的作用(因为obj本身不是一个函数,您必须像这样调用它的主要功能 obj.main(); )
Namespace = {
obj: {
main : function() {
this.foo="bar";
},
prototype : {
start: function(tabinst) {
this.foo="fubar";
}
}
}
}
编辑2:查看此fiddle http://jsfiddle.net/NmA3v/1/
Namespace = {
obj: function() {
this.foo="bar";
},
prototype: {
obj : {
start : function( hi ) {
alert( hi );
}
}
},
initProto : function(){
for( var key in Namespace )
{
if( key !== "prototype" )
{
for( var jey in Namespace.prototype[ key ] )
Namespace[ key ].prototype[ jey ] = Namespace.prototype[ key ][ jey ];
}
}
}
}
Namespace.initProto();
console.log( Namespace.obj);
var test = new Namespace.obj();
test.start( "Hello World" );
这将产生完全相同的效果。
解释:我们将对象声明为普通属性函数,然后使用一个主原型对象,其中包含与上述名称相同的对象。例如,对于每个Namespace.obj,还有一个包含我们要添加到原型链中的函数的Namespace.prototype.obj。
接下来,通过namespace.protoInit(),我们遍历所有属性-并从Namespace.prototype [key]中提取函数,并将它们添加到Namespace[key].prototype-成功扩展了原型对象!这有点不正规,但可行!
blah
函数添加到返回对象中:. . return { obj : obj, obj2: obj2, blah: function () {/* 做一些事情 */} };
- Amjad Masad