Javascript 类中ES6之前的静态函数

Javascript 类中ES6之前的静态函数,javascript,class,ecmascript-6,static-methods,static-variables,Javascript,Class,Ecmascript 6,Static Methods,Static Variables,我的问题(见下文)是如何声明ES6之前的类的静态函数和常量,以便它们可以被继承 在提问之前,我们将对当前的ES6课程和ES6之前的课程进行回顾,因此我们都使用相同的约定 在后ES6中,我们可以在类中定义静态函数,如下所示: class MyClass { static someMethod () { console.log('Doing someMethod'); } } var MyClassBase = function(str){ this.m_D

我的问题(见下文)是如何声明ES6之前的类的静态函数和常量,以便它们可以被继承

在提问之前,我们将对当前的ES6课程和ES6之前的课程进行回顾,因此我们都使用相同的约定

在后ES6中,我们可以在类中定义静态函数,如下所示:

class MyClass {
    static someMethod () {
        console.log('Doing someMethod');
    }
}
var MyClassBase = function(str){
    this.m_Data = str; // This acts a bit like a constructor where you can assign data within the class
};
在ES6之前的版本中,我可以创建一个基类,如下所示:

class MyClass {
    static someMethod () {
        console.log('Doing someMethod');
    }
}
var MyClassBase = function(str){
    this.m_Data = str; // This acts a bit like a constructor where you can assign data within the class
};
您可以使用创建ES6之前的实例

var myclassbase = new MyClassBase("Wibble");
您可以创建该类的ES6之前的非静态成员函数:

MyClassBase.prototype.EchoData = function(){
    console.log(this.m_Data);
}
您需要一个实例来调用该非静态成员函数:

var myclassbase = new MyClassBase("Wibble");
myclassbase.EchoData();
要继承ES6之前的版本,我将执行以下操作:

var MyClass = function(str){
    MyClassBase.call(this, str);
};
MyClass.prototype = new MyClassBase(); // inherit
[编辑]:但是@adiga在评论中建议(参见其有用的链接),更好的方法是:

var MyClass = function(str){
    MyClassBase.call(this, str);
};
MyClass.prototype = Object.create(MyClassBase.prototype);
MyClass.prototype.constructor = MyClass;
这都是背景。现在是关于静力学的问题

问题:如何在基类
MyClassBase
中创建无需实例即可调用的静态函数,例如:

MyClassBase.StaticFunctionInMyClassBase();
MyClass.StaticFunctionInMyClassBase(); // This could be the inherited function from MyClassBase,
                                        // or may be a redefined overridden function in MyClass
问题:如何将静态常量分配给
MyClass
MyClassBase
无需实例即可访问的ES6之前版本?比如说,

var result = MyClassBase.TWO_PLUS_TWO; // Echos 4, a predefined static value in MyClassBase
var result = MyClass.TWO_PLUS_TWO; // Echos 5, if TWO_PLUS_TWO has been redefined in MyClass,
                                        // or 4 if TWO_PLUS_TWO has no been redefined in MyClass
Kai的建议:静力学可包含在以下内容中:

var MyClassBase = function(str){
    this.m_Data = str;
};
MyClassBase.STATIC_STRING = "Ooops";
但是,当我创建继承MyClassBase的类时,
MyClass
,那么
MyClass.STATIC\u STRING
未定义的。我只能使用
MyClassBase.STATIC\u STRING
访问“Ooops”。这是正常的班级惯例吗

如何创建无需实例即可调用的静态函数,以及如何分配无需实例即可访问的静态常量

方法和常量都只是类(构造函数)对象的属性,通过赋值创建:

var MyClassBase = function(str){
    this.m_Data = str;
};
MyClassBase.STATIC_STRING = "Ooops";
另见或

当我创建继承
MyClassBase
的类
MyClass
时,
MyClass.STATIC\u STRING
未定义。这是正常的班级惯例吗

是的,这在ES5继承中是正常的:

(或者在ES5中,人们确实使用了现在已弃用的
\uuuuuuuuuuuuuuuuuuuuu


但是请注意,经常使用。

MySuperClass.prototype=new MyClass()
不是正确的继承方式。您需要使用
MySuperClass.prototype=Object.create(MyClass.prototype)
并更新回构造函数属性:
MySuperClass.prototype.constructor=MySuperClass
MyClass.YOURSTATIC=42。没什么特别的。@adiga谢谢你的评论,但我认为我做得对,你链接上的勾选答案似乎证实了这一点。在我的示例中,如果我要使用
Object.create
,那么我的
这个.m_数据在
MySuperClass
的实例中将不可用。通过使用
MySuperClass.prototype=new MyClass()
意味着
此.m_数据将在
MySuperClass
的实例中可用
此.m_数据
已可用于
MySuperClass
的实例,因为
MyClass.call(this,str)
。“当我创建继承
MyClassBase
的类
MyClass
时,
MyClass.STATIC\u STRING
未定义。这是正常的类约定吗?”-是的,这在ES5继承中是正常的。(使用
对象.setPrototypeOf
,或其现在已弃用的前身
\uuuuuu proto\uuuuu
)。但是请注意,这种情况经常发生。