Sí, porque, no se puede utilizar este tipo de encadenamiento en una declaración de objeto
obj.prototype o obj.something aquí, porque el lenguaje obj ve como un valor que no es objeto. Usted puede fingir un efecto tal como esto
Namespace = {};
Namespace.obj =function() {
this.foo="bar";
};
Namespace.obj.prototype.start = function(tabinst) {
this.foo="fubar";
};
console.log(Namespace.obj.prototype);
(ver este violín http://jsfiddle.net/WewnF/)
EDIT: Wow, me he dado cuenta de que lo que he dicho ya dentro de la pregunta era. Lo siento mucho no haberlo notado antes ... Bueno, la forma en que te describes a ti mismo es el método correcto para lograr esto.
De lo contrario, puede volver a escribir su código de esta manera, pero no es exactamente lo que busca y no funcionará igual (ya que obj no será una función en sí y tendrá que llamar a su función principal como esto obj.main();)
Namespace = {
obj: {
main : function() {
this.foo="bar";
},
prototype : {
start: function(tabinst) {
this.foo="fubar";
}
}
}
}
EDIT 2: Ver este violín 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");
esto tendrá exactamente el mismo efecto. Explicación: estamos declarando nuestros objetos como propiedades-funciones normales, y luego usamos un objeto prototipo maestro que contiene objetos con los mismos nombres que antes, por ejemplo para cada Namespace.obj, también hay un Namespace.prototype.obj que contiene las funciones que queremos agregar en la cadena de prototipos.
luego con namespace.protoInit(), iteramos a través de todas las propiedades - y extraemos las funciones de Namespace.prototype [key] y las agregamos al Namespace [key] .prototype - extendiendo con éxito el objeto prototipo! Un poco heterodoxo, pero funciona!
Buen enfoque, +1. – Jiri
Thans Amjad, esto es genial. Pero ahora estoy tropezando de nuevo. ¿Lo veo bien? Con este enfoque, no es posible crear una función Namespace.blah() que esté separada de obj? –
@Johnny Si entiendo bien su pregunta, simplemente agregue una función 'blah' al objeto de devolución: '. . retorno { obj: obj, obj2: obj2, bla: function() {/ * hacer algo * /}} ; ' –