tipos - prototype javascript ejemplos
¿Cómo heredar métodos estáticos de la clase base en JavaScript? (6)
Estoy tratando de lograr un OOP básico en JavaScript con la forma prototipo de herencia. Sin embargo, no encuentro la forma de heredar miembros estáticos (métodos) de la clase base.
Podemos simular el modelo de clase básica utilizando prototipo:
SomeClass = function(){
var private_members;
this.public_method = function(){
//some instance stuff..
};
};
Class.static_method = function(){
//some static stuff;
};
//Inheritance
SubClass = function(){ //sub-class definition };
SubClass.prototype = new Class();
Sin embargo, SubClass
no hereda static_method
de Class
.
¿Cómo estás implementando métodos ''estáticos''? Dado que JavaScript no tiene un modelo de objeto de clase / instancia nativo, todo depende de cómo haya diseñado su propio sistema de clases.
Si desea poder heredar algo, tendrá que estar usando el objeto SomeClass.prototype
, en lugar de poner algo directamente en la función de constructor SomeClass
. Esencialmente, estará definiendo métodos estáticos como métodos de instancia normales, pero a aquellos que no les importa qué valor de this
se transfiere a ellos.
Después de su código de ejemplo puede hacer esto:
for (var i in Class) {
SomeClass[i] = Class[i];
}
para copiar miembros estáticos de la Class
a la SubClass
.
Si está utilizando jQuery, eche un vistazo al complemento jQuery.Class de JavaScriptMVC . O puede extender la Herencia de JavaScript simple de John Resig para un sistema más sin uso de bibliotecas.
En el patrón de herencia clásico (OO), los métodos estáticos en realidad no se heredan. Por lo tanto, si tiene un método estático, ¿por qué no llamar a: SuperClass.static_method()
siempre que lo necesite, no es necesario que JavaScript guarde referencias adicionales o copias del mismo método?
También puede leer este Patrones de anulación de JavaScript para comprender mejor cómo implementar la herencia en JavaScript.
Para ES5, deberá usar Object.assign
para copiar métodos estáticos de BaseClass a SubClass, pero para ES6 debería funcionar sin usar Object.assign
Ejemplo de ES5
var BaseClass = function(){
}
BaseClass.sayHi = function(){
console.log("Hi!");
}
var SubClass = function(){
}
Object.assign(SubClass , BaseClass);
BaseClass.sayHi(); //Hi
SubClass.sayHi(); //Hi
Ejemplo ES6
class BaseClass {
static sayHi(){
console.log("Hi!");
}
}
class SubClass extends BaseClass{
}
BaseClass.sayHi() //Hi
SubClass.sayHi() //Hi
Prueba esto:
class BaseClass {
static baseMethod () {
console.log("Hello from baseMethod");
}
}
class MyClass extends BaseClass {
constructor(props) {
super(props);
}
}
Object.assign(MyClass, BaseClass);
La clave es Object.assign
que debería ser el mejor amigo de todos. Ahora puede llamar a cualquier método base desde BaseClass
usando MyClass
siguiente manera:
MyClass.baseMethod();
Puedes ver esto en vivo y en acción en esta pluma .
¡Disfrutar!
puede acceder a static fields
través de this.constructor[staticField]
;
class A {
static get Foo() { return ''Foo''; }
constructor() {
console.log(`Class ${this.constructor.name}`, this.constructor.Foo);
}
}
class B extends A {
static get Foo() { return ''Baz''; }
}
class C extends A {}
const a = new A();
const b = new B();
const c = new C()