javascript - 类中的 Pre ES6 静态函数
问题描述
我的问题,见下文,是如何声明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 在评论中建议(查看他们有用的链接),更好的方法是:
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
问题:如何将静态常量分配给ES6MyClass
之前MyClassBase
可以在没有实例的情况下访问?例如,
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";
但是,当我创建MyClass
继承的类时MyClassBase
,MyClass.STATIC_STRING
则为undefined
. 我只能使用MyClassBase.STATIC_STRING
. 那是正常的班级约定吗?
解决方案
如何创建无需实例即可调用的静态函数,以及如何分配无需实例即可访问的静态常量?
方法和常量都只是类(构造函数)对象的属性,通过赋值创建:
var MyClassBase = function(str){
this.m_Data = str;
};
MyClassBase.STATIC_STRING = "Ooops";
另请参阅JavaScript:Class.method 与 Class.prototype.method或JavaScript 中的静态变量。
当我创建
MyClass
继承的类时MyClassBase
,则MyClass.STATIC_STRING
未定义。那是正常的班级约定吗?
是的,这在 ES5 继承中是正常的。要模拟 ES6,您需要手动设置构造函数的原型:
Object.setPrototypeOf(MyClass, MyClassBase);
(或者在 ES5 中,确实使用了 now-deprecated __proto__
)。
但是请注意,您想要显式引用的MyBaseClass
次数已经足够多。
推荐阅读
- r - 重新索引 R 中的列
- python - 如何通过 python 脚本获取 gcp stackdriver 日志?
- c++ - TCHAR* 的 C++ TEXT 宏
- sql - 如何编写查询以在 BigQuery 中插入 python 字典中的数组值?
- html - 如何更改电子表格主题也更改 HTML 样式和背景
- reactjs - 无法读取 NextJS 服务器中未定义的属性“indexOf”
- git - 在一个存储库github的一个父文件夹中添加两个文件夹
- searchkick - Searchkick,如何在连接表上使用聚合
- centos7 - Spyder:libGL 错误:未找到匹配的 fbConfigs 或视觉效果并且无法加载驱动程序:swrast
- swiftui - 所有 SwiftUI 视图类型的列表