Class 中的 ES6 之前的静态函数
Pre ES6 Static Functions in a Class
我的问题,见下文,是如何声明 pre-ES6 class 的 STATIC 函数和常量以便它们可以被继承?
在问题之前给出了当前 ES6 class 和 ES6 之前的 classes 的回顾,因此我们都使用相同的约定。
在postES6中我们可以在class中定义一个静态函数如下:
class MyClass {
static someMethod () {
console.log('Doing someMethod');
}
}
在 ES6 之前我可以创建一个基础 class 如下:
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 之前的非静态成员函数 class:
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 之前的基础上创建静态函数 class 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
的 class MyClass
时,MyClass.STATIC_STRING
就是 undefined
。我只能使用 MyClassBase.STATIC_STRING
访问“Ooops”。这是正常的 class 约定吗?
How do I create static functions which can be called without an instance, and how do I assign static constants which can be accessed without an instance?
方法和常量都只是class(构造函数)对象的属性,并且是通过赋值创建的:
var MyClassBase = function(str){
this.m_Data = str;
};
MyClassBase.STATIC_STRING = "Ooops";
另见 JavaScript: Class.method vs. Class.prototype.method or Static variables in JavaScript。
When I create my class MyClass
which inherits MyClassBase
, then MyClass.STATIC_STRING
is undefined. Is that normal class conventions?
是的,这在ES5继承中很正常。 :
Object.setPrototypeOf(MyClass, MyClassBase);
(或者在 ES5 中,确实使用了现已弃用的 __proto__
)。
但是请注意,经常you want to explicitly refer to MyBaseClass
anyway。
我的问题,见下文,是如何声明 pre-ES6 class 的 STATIC 函数和常量以便它们可以被继承?
在问题之前给出了当前 ES6 class 和 ES6 之前的 classes 的回顾,因此我们都使用相同的约定。
在postES6中我们可以在class中定义一个静态函数如下:
class MyClass {
static someMethod () {
console.log('Doing someMethod');
}
}
在 ES6 之前我可以创建一个基础 class 如下:
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 之前的非静态成员函数 class:
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 之前的基础上创建静态函数 class 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
的 class MyClass
时,MyClass.STATIC_STRING
就是 undefined
。我只能使用 MyClassBase.STATIC_STRING
访问“Ooops”。这是正常的 class 约定吗?
How do I create static functions which can be called without an instance, and how do I assign static constants which can be accessed without an instance?
方法和常量都只是class(构造函数)对象的属性,并且是通过赋值创建的:
var MyClassBase = function(str){
this.m_Data = str;
};
MyClassBase.STATIC_STRING = "Ooops";
另见 JavaScript: Class.method vs. Class.prototype.method or Static variables in JavaScript。
When I create my class
MyClass
which inheritsMyClassBase
, thenMyClass.STATIC_STRING
is undefined. Is that normal class conventions?
是的,这在ES5继承中很正常。
Object.setPrototypeOf(MyClass, MyClassBase);
(或者在 ES5 中,确实使用了现已弃用的 __proto__
)。
但是请注意,经常you want to explicitly refer to MyBaseClass
anyway。