Javascript ES6:访问从Mixin创建的类中的静态成员变量
我根据MDN()中的官方示例创建了一个类 这是我的密码Javascript ES6:访问从Mixin创建的类中的静态成员变量,javascript,ecmascript-6,es6-class,ecmascript-next,Javascript,Ecmascript 6,Es6 Class,Ecmascript Next,我根据MDN()中的官方示例创建了一个类 这是我的密码 class A { } const Mixer = BaseClass => class extends BaseClass { static val = 10; } class B extends Mixer(A) { myMethod() { // Need some way to access the static member "val" } } 如何访问“val” 如果没有mixin(即
class A {
}
const Mixer = BaseClass => class extends BaseClass {
static val = 10;
}
class B extends Mixer(A) {
myMethod() {
// Need some way to access the static member "val"
}
}
如何访问“val”
如果没有mixin(即类B扩展了A,而val在类A中是静态的),我就可以完成“A.val”
在这个场景中,Mixer.val不起作用,据我所知,B是从匿名类扩展而来的,因此无法通过名称访问超类
编辑:我把问题搞错了。我真正的问题是在混合器中访问val。正如我在回答中指出的,在B中访问val是直接的
比如说
const Mixer = BaseClass => class extends BaseClass {
static val = 10;
myMethod2() {
// log the val member
}
}
这是因为类字段是。如果您随后将其复制并粘贴到浏览器控制台,那么您的代码工作得非常好
class B extends Mixer(A) {
myMethod() {
console.log(B.val); // logs 10
}
}
如果您需要使用ES2015,一个快速的技巧就是使用setter和getter
class A {
}
var val = 10;
const Mixer = BaseClass => class extends BaseClass {
static get val() {
return val;
}
static set val(newVal) {
val = newVal;
}
}
class B extends Mixer(A) {
myMethod() {
// Need some way to access the static member "val"
}
}
// Use it
B.val; // 10
B.val = 15;
B.val; // 15
es6不支持
static属性
,我不知道babel
如何处理static val
,但事实是,您测试的内容并不基于es6规范。因此,您可以使用静态函数
进行测试这已经讨论了很多次,但这种情况可能需要一些解释。通常,可以使用this.constructor从实例方法访问静态属性和方法
class B extends Mixer(A) {
myMethod() {
console.log(this.constructor.val);
}
}
其中this.constructor==B
,但在继承自B
的类中,情况并非如此
没有理由在
B
中直接引用父匿名类,因为val
是通过原型链从父匿名类继承的。这就是类继承的目的。您不能使用ES2015类语法(SyntaxError:bad method definition
)定义静态属性。我使用的是Babel,它确实为我生成了代码。这是巴别塔特有的吗?我想你用的是,它实现了这是真的,我用的是这个。我的问题有解决办法吗?没有,我想不出解决办法。因为,正如您所说,您丢失了对超级类的引用。确实,它将在类B中可用,作为B.val,但是如果我需要访问Mixer类本身中的val呢?我不确定getter和setter方法,因为它正在污染全局名称空间。我的错。我使用的是Babel,因此目前还没有意识到这不是标准的一部分。谢谢更新。我已经更改了我的问题。它仍然是this.constructor.val
。您可以将其命名为类,比如=>类MixinClass扩展了基类
,并将其称为MixinClass.val
,但您甚至不需要这样做this.constructor
处理此问题。谢谢,this.constructor解决了此问题。我想尝试匿名类,所以没有创建命名类。