javascript - tutorial - Class.prototype.method vs this.prototype.method
prototype jquery (3)
¿Existe este prototipo?
No. Pero, este
this.constructor.prototype
debería.¿Es lo mismo que la clase (.constructor) .prototipo?
En general, tendrá el mismo valor (siempre que
this.constructor === Class
), pero no la misma intención.¿Qué pasa con la herencia?
Cada
new Class
instancia denew Class
heredará deClass.prototype
. Por lo tanto, un objetoprototype
es bueno para definir valores compartidos accesibles para todas las instancias. Luego, el constructor solo tiene que configurar el estado que es único para cada instancia.Sin embargo, intentar mezclar el 2 y establecer una propiedad
prototype
dentro del constructor tiene algunos problemas, incluido un conflicto de gallina o huevo ya que el método no existirá hasta que se cree la primera instancia:function Class() { this.constructor.prototype.method = function () {}; } console.log(typeof Class.prototype.method); // "undefined" var a = new Class(); console.log(typeof Class.prototype.method); // "function"
Y elimina algunos de los beneficios de tener el
prototype
ya que el método se recrea con cada instancia adicional:var method = a.method; console.log(a.method === method); // true var b = new Class(); console.log(a.method === method); // false
Siempre he visto ejemplos de Class.prototype.method, pero nunca instancias de this.prototype.method. Por ejemplo:
function Class() {
this.prototype.method = function() {
alert("is this allowed?");
};
}
vs
function Class() {}
Class.prototype.method = function() {
alert("traditional example");
};
- ¿Existe este prototipo?
- ¿Es lo mismo que Class.prototype?
- ¿Qué pasa con la herencia?
this.prototype se referiría a esa instancia del objeto de clase. No te daría mucho beneficio por el alcance.
Class.prototype agrega funcionalidad a la Clase, no a la instancia de la misma.
Class
es una función; this
es un objeto Las funciones tienen una propiedad prototype
; los objetos no lo hacen. Hay una propiedad __proto__
definida en los objetos, pero esa interfaz está en desuso. Puedes hacer algo como
function Class () {
var prototype = Object.getPrototypeOf(this);
prototype.method = function () {};
}
dentro de su constructor, pero no es realmente una buena práctica: cada vez que se crea una instancia de la Class
, se perderá innecesariamente el method
sobrescritura de los ciclos en el prototipo, y en casos con código más complejo, también se puede perder la memoria.
En resumen, no hay inconvenientes al revés y posiblemente graves para hacerlo de esa manera.