Подтвердить что ты не робот

Как наследовать статические методы из базового класса в 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.

4b9b3361

Ответ 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()