Как наследовать статические методы от базового класса в JavaScript? - PullRequest
28 голосов
/ 26 марта 2011

Я пытаюсь достичь некоторого базового ООП в 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.

Ответы [ 6 ]

16 голосов
/ 29 марта 2011

В классическом (OO) шаблоне наследования статические методы фактически не наследуются.Поэтому, если у вас есть статический метод, почему бы просто не вызывать: SuperClass.static_method() всякий раз, когда он вам нужен, вам не нужно JavaScript, чтобы хранить дополнительные ссылки или копии того же метода.

Вы также можете прочитать это Шаблоны переопределения JavaScript , чтобы лучше понять, как реализовать наследование в JavaScript.

9 голосов
/ 12 апреля 2011

После примера кода вы можете сделать это:

for (var i in Class) {
    SomeClass[i] = Class[i];
}

, чтобы скопировать статические элементы из Class в SubClass.

Если вы используете jQuery, посмотритев плагине jQuery.Class из JavaScriptMVC .Или вы можете расширить Простое наследование JavaScript Джона Резига для более независимой от библиотек системы.

7 голосов
/ 05 февраля 2018

Для ES5 вам потребуется использовать Object.assign для копирования статических методов из BaseClass в SubClass, но для ES6 он должен работать без использования Object.assign

ES5 Пример

var BaseClass = function(){

}

BaseClass.sayHi = function(){
   console.log("Hi!");
}

var SubClass = function(){

}

Object.assign(SubClass , BaseClass);

BaseClass.sayHi();   //Hi
SubClass.sayHi(); //Hi

ES6 Пример

class BaseClass {
   static sayHi(){
     console.log("Hi!");
   }
}

class SubClass extends BaseClass{

}

BaseClass.sayHi()   //Hi
SubClass.sayHi() //Hi
7 голосов
/ 24 июня 2016

Попробуйте это:

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();

Вы можете увидеть это вживую и в действии на этой ручке .

Наслаждайтесь!

1 голос
/ 26 марта 2011

Как вы реализуете «статические» методы?Поскольку у JavaScript нет нативной объектной модели класса / экземпляра, все зависит от того, как вы спроектировали свою собственную систему классов.

Если вы хотите иметь возможность наследовать что-либо, то придется использоватьобъект SomeClass.prototype вместо того, чтобы помещать что-либо непосредственно в функцию конструктора SomeClass.По сути, вы будете определять статические методы как обычные методы экземпляров, но те, которые не заботятся о том, какое значение this передается в них.

0 голосов
/ 22 августа 2017

вы можете получить доступ к 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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...