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

时间:2011-03-26 09:39:19

标签: 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();

但是,SubClass不会从static_method继承Class

6 个答案:

答案 0 :(得分:16)

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

您还可以阅读此JavaScript Override Patterns以更好地了解如何在JavaScript中实现继承。

答案 1 :(得分:9)

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

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

将静态成员从Class复制到SubClass

如果你正在使用jQuery,请查看来自jQuery.ClassJavaScriptMVC插件。或者您可以扩展John Resig的Simple JavaScript Inheritance以获得更多与库无关的系统。

答案 2 :(得分:7)

试试这个:

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

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

Object.assign(MyClass, BaseClass);

他们的关键是Object.assign,这应该是每个人最好的朋友。您现在可以使用BaseClassMyClass调用任何基本方法,如下所示:

MyClass.baseMethod();

您可以在this pen上查看此内容和实际操作。

享受!

答案 3 :(得分:7)

对于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

答案 4 :(得分:1)

您如何实施'静态'方法?由于JavaScript没有本机类/实例对象模型,所有这些都取决于您如何设计自己的类系统。

如果您希望能够继承任何内容,则必须使用SomeClass.prototype对象,而不是直接在SomeClass构造函数上放置任何内容。所以基本上你将静态方法定义为普通实例方法,但不关心this的值传递给它们。

答案 5 :(得分:0)

您可以通过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()