如何在JavaScript中从基类继承静态方法?

Wil*_*hoi 28 javascript oop inheritance static

我试图用原型继承方式在JavaScript中实现一些基本的OOP.但是,我发现无法从基类继承静态成员(方法).

我们可以使用原型模拟基本类模型:

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();
Run Code Online (Sandbox Code Playgroud)

但是,SubClass不继承static_methodClass.

Dra*_*DTG 16

在经典(OO)继承模式中,静态方法实际上不会被继承下来.因此,如果你有一个静态方法,为什么不调用:SuperClass.static_method()只要你需要它,就不需要JavaScript来保留额外的引用或相同方法的副本.

您还可以阅读此JavaScript覆盖模式,以更好地了解如何在JavaScript中实现继承.


Jef*_* To 9

在示例代码之后,您可以执行以下操作:

for (var i in Class) {
    SomeClass[i] = Class[i];
}
Run Code Online (Sandbox Code Playgroud)

将静态成员复制ClassSubClass.

如果您正在使用jQuery,请查看JavaScriptMVC中的jQuery.Class插件.或者,您可以扩展John Resig的简单JavaScript继承,以获得更多与库无关的系统.


Amr*_*bib 8

对于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
Run Code Online (Sandbox Code Playgroud)

ES6示例

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

class SubClass extends BaseClass{

}

BaseClass.sayHi()   //Hi
SubClass.sayHi() //Hi
Run Code Online (Sandbox Code Playgroud)


小智 7

试试这个:

class BaseClass {
    static baseMethod () {
        console.log("Hello from baseMethod");
    }
}

class MyClass extends BaseClass {
    constructor(props) {
        super(props);
    }
}

Object.assign(MyClass, BaseClass);
Run Code Online (Sandbox Code Playgroud)

他们的关键Object.assign应该是每个人都是最好的朋友.现在,您可以调用任何基础的方法BaseClass使用MyClass如下:

MyClass.baseMethod();
Run Code Online (Sandbox Code Playgroud)

你可以在这支笔上看到这个现场直播.

请享用!

  • `Object.setPrototypeOf(MyClass,BaseClass)`将避免破坏任何覆盖静态方法. (4认同)
  • 正如@chocolateboy 提到的,这个答案是错误的。不需要 `Object.assign`,您可以通过运行 `MyClass.baseMethod()` 来验证这一点 (4认同)
  • 这个答案很适合这个问题。尽管这是一个可行的解决方案,但在大多数浏览器都支持“ class”表达式之前,人们就提出了这个问题,并且示例代码显然是使用函数原型实现继承。 (2认同)
  • 它在ES6中[有效](https://codepen.io/anon/pen/qpdyOx?editors=0011)[没有分配](https://www.bennadel.com/blog/3300-static-methods-are -在使用ES6时继承-在JavaScript和节点js.htm中扩展语法)。 (2认同)