【发布时间】:2021-08-11 08:49:18
【问题描述】:
我的问题,见下文,是如何声明 pre-ES6 类的 STATIC 函数和常量以便它们可以被继承?
问题之前给出了当前 ES6 类和 ES6 之前的类的回顾,因此我们都使用相同的约定。
在 ES6 之后,我们可以在一个类中定义一个静态函数,如下所示:
class MyClass {
static someMethod () {
console.log('Doing someMethod');
}
}
在 ES6 之前,我可以创建一个基类,如下所示:
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");
您可以创建该类的 pre-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 在 cmets 中建议(查看他们有用的链接)更好的方法是:
var MyClass = function(str){
MyClassBase.call(this, str);
};
MyClass.prototype = Object.create(MyClassBase.prototype);
MyClass.prototype.constructor = MyClass;
这都是背景。现在是关于静力学的问题。
问题:如何在 ES6 之前在基类 MyClassBase 中创建静态函数,无需实例即可调用,例如:
MyClassBase.StaticFunctionInMyClassBase();
MyClass.StaticFunctionInMyClassBase(); // This could be the inherited function from MyClassBase,
// or may be a redefined overridden function in MyClass
问题:如何为MyClass 和MyClassBase pre-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_STRING 就是 undefined。我只能使用MyClassBase.STATIC_STRING 访问“糟糕”。那是正常的类约定吗?
【问题讨论】:
-
MySuperClass.prototype = new MyClass()不是正确的继承方式。您需要使用MySuperClass.prototype = Object.create(MyClass.prototype)并更新回构造函数属性:MySuperClass.prototype.constructor = MySuperClassJavaScript inheritance: Object.create vs new -
MyClass.YOURSTATIC = 42。没什么特别的。
-
@adiga 感谢您的评论,但我认为我做得对,您链接中勾选的答案似乎已确认。在我的示例中,如果我要使用
Object.create,那么我的this.m_Data在MySuperClass的实例中将不可用。通过使用MySuperClass.prototype = new MyClass()意味着this.m_Data将在MySuperClass的实例中可用。 -
由于
MyClass.call(this, str),this.m_Data已经可用于MySuperClass的实例。 -
"当我创建继承
MyClassBase的类MyClass时,MyClass.STATIC_STRING未定义。这是正常的类约定吗?" - 是的,这是正常的在 ES5 继承中。 To emulate ES6, you would need to manually set the prototype of the constructor(使用Object.setPrototypeOf,或其现已弃用的前身__proto__)。但是请注意,you want to explicitly refer toMyBaseClassanyway.
标签: javascript class ecmascript-6 static-methods static-variables