Javascript ES6:访问从Mixin创建的类中的静态成员变量

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(即

我根据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(即类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解决了此问题。我想尝试匿名类,所以没有创建命名类。