我正在尝试使用原型继承方式在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
。
答案 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.Class的JavaScriptMVC插件。或者您可以扩展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
,这应该是每个人最好的朋友。您现在可以使用BaseClass
从MyClass
调用任何基本方法,如下所示:
MyClass.baseMethod();
您可以在this pen上查看此内容和实际操作。
享受!
答案 3 :(得分:7)
对于ES5,您需要使用Object.assign
将静态方法从BaseClass复制到SubClass,但对于ES6,它应该不使用Object.assign
var BaseClass = function(){
}
BaseClass.sayHi = function(){
console.log("Hi!");
}
var SubClass = function(){
}
Object.assign(SubClass , BaseClass);
BaseClass.sayHi(); //Hi
SubClass.sayHi(); //Hi
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()