Как наследовать статические методы из базового класса в JavaScript?
Я пытаюсь достичь базового ООП в JavaScript с прототипом способа наследования. Однако я не нашел способа наследовать статические члены (методы) из базового класса.
Мы можем моделировать базовую модель класса с использованием прототипа:
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();
Однако SubClass
не наследует static_method
от Class
.
Ответы
Ответ 1
Попробуйте следующее:
class BaseClass {
static baseMethod () {
console.log("Hello from baseMethod");
}
}
class MyClass extends BaseClass {
constructor(props) {
super(props);
}
}
Object.assign(MyClass, BaseClass);
Их ключ Object.assign
, который должен быть всем новым лучшим другом. Теперь вы можете вызывать любой базовый метод из BaseClass
с помощью MyClass
следующим образом:
MyClass.baseMethod();
Вы можете видеть это вживую и в действии на это перо.
Наслаждайтесь!
Ответ 2
В классическом (OO) шаблоне наследования статические методы фактически не унаследованы. Поэтому, если у вас есть статический метод, почему бы просто не вызвать: SuperClass.static_method()
всякий раз, когда вам это нужно, нет необходимости в JavaScript для хранения дополнительных ссылок или копий одного и того же метода.
Вы также можете прочитать это Шаблоны переопределения JavaScript, чтобы лучше понять, как реализовать наследование в JavaScript.
Ответ 3
После кода примера вы можете сделать это:
for (var i in Class) {
SomeClass[i] = Class[i];
}
для копирования статических элементов от Class
до SubClass
.
Если вы используете jQuery, посмотрите jQuery.Class плагин из JavaScriptMVC. Или вы можете расширить John Resig Простой наследование JavaScript для более библиотечно-агностической системы.
Ответ 4
Как вы реализуете "статические" методы? Поскольку JavaScript не имеет объектной модели родного класса/экземпляра, все зависит от того, как вы разработали свою собственную систему классов.
Если вы хотите унаследовать что-либо, он должен будет использовать объект SomeClass.prototype
, а не помещать что-либо непосредственно в конструктор SomeClass
. Таким образом, вы будете определять статические методы как обычные методы экземпляра, но те, которые не заботятся о том, какое значение this
передается в них.
Ответ 5
вы можете получить доступ к static fields
через 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()