Huh. Parece mucho más complicado de lo que necesita ser, para mí.
En realidad, al observar más de cerca realmente me tomo una excepción con lo que está haciendo al proporcionar this._super()
mientras estoy en un método, para llamar al método de la superclase.
El código introduce una dependencia de typeof==='function'
(no fiable para algunos objetos), Function#toString
(argh, la descomposición función también es poco fiable), y decidir si se debe envolver en función de si usted ha utilizado la secuencia de bytes _super
en el cuerpo de la función (incluso si solo lo ha usado en una cadena. Si lo intenta, por ejemplo, this['_'+'super']
, fallará).
Y si está almacenando propiedades en los objetos de su función (por ejemplo, MyClass.myFunction.SOME_PRIVATE_CONSTANT
, lo que podría hacer para mantener limpios los espacios de nombres), la envoltura le impedirá acceder a esas propiedades. Y si se arroja una excepción en un método y se atrapa en otro método del mismo objeto, _super
terminará señalando algo incorrecto.
Todo esto es solo para hacer que llamar al método del mismo nombre de la superclase sea más fácil. Pero no creo que eso sea especialmente difícil de hacer en JS de todos modos. Es demasiado inteligente para su propio bien, y en el proceso hace que todo sea menos confiable. (Ah, y arguments.callee
no es válido en el modo estricto, aunque eso no es realmente su culpa ya que ocurrió después de que lo publicó).
Esto es lo que estoy usando para las clases en este momento. No afirmo que este es el "mejor" sistema de clases JS, porque hay cargas de diferentes maneras de hacerlo y un montón de características diferentes que puede querer agregar o no agregar. Pero es muy ligero y pretende ser 'JavaScriptic', si es una palabra. (No lo es.)
Function.prototype.makeSubclass= function() {
function Class() {
if (!(this instanceof Class))
throw 'Constructor function requires new operator';
if ('_init' in this)
this._init.apply(this, arguments);
}
if (this!==Object) {
Function.prototype.makeSubclass.nonconstructor.prototype= this.prototype;
Class.prototype= new Function.prototype.makeSubclass.nonconstructor();
}
return Class;
};
Function.prototype.makeSubclass.nonconstructor= function() {};
Proporciona:
protección contra la falta accidental new
. La alternativa es redirigir silenciosamente X()
a new X()
para que falte new
. Es un lanzamiento que es mejor; Fui en busca de un error explícito para que uno no se acostumbre a escribir sin new
y cause problemas en otros objetos no definidos así. De cualquier forma, es mejor que el inaceptable error JS de dejar que las propiedades this.
caigan en window
y misteriosamente se equivocan más tarde.
método de _init
heredable, por lo que no tiene que escribir una función de constructor que no haga más que llamar a la función de constructor de superclase.
y eso es todo.
Así es como usted puede utilizarlo para poner en práctica el ejemplo de Resig:
var Person= Object.makeSubclass();
Person.prototype._init= function(isDancing) {
this.dancing= isDancing;
};
Person.prototype.dance= function() {
return this.dancing;
};
var Ninja = Person.makeSubclass();
Ninja.prototype._init= function() {
Person.prototype._init.call(this, false);
};
Ninja.prototype.swingSword= function() {
return true;
};
var p= new Person(true);
p.dance(); // => true
var n = new Ninja();
n.dance(); // => false
n.swingSword(); // => true
// Should all be true
p instanceof Person &&
n instanceof Ninja && n instanceof Person
superclase-llamada se hace nombrando específicamente el método que desea y call
ing ella, un poco como en Python. Usted podría agregar un miembro _super
a la función constructora si desea evitar nombrar de nuevo Person
(por lo que diría Ninja._super.prototype._init.call
, o quizás Ninja._base._init.call
).
que he visto Javascript "en producción "que hace llorar a los ángeles bebé gatito, por lo que depende de ti decidir el impacto que tendría en tu unidad/página de prueba. Es algo tan simple que es difícil imaginar que provoque problemas serios. – Pointy
+1 Puntiagudo. Acabo de criticar a continuación, pero en realidad el 99% de los sitios web tienen un código más cuestionable que el de ellos ya ... – bobince
jQuery para empezar ... –