【问题标题】:ES6: Accessing static member variables in classes created from Mixin [duplicate]ES6:访问从 Mixin 创建的类中的静态成员变量 [重复]
【发布时间】:2018-03-12 04:51:24
【问题描述】:

我根据 MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes) 的官方示例创建了一个类

这是我的代码

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 从匿名类扩展,因此无法通过名称访问超类。

编辑:我问错了。我真正的问题是在 Mixer 本身中访问 val 。正如我的答案所指出的那样,在 B 中访问 val 很简单。

例如

const Mixer = BaseClass => class extends BaseClass {
    static val = 10;
    myMethod2() {
        // log the val member
    }
}

【问题讨论】:

  • 您不能使用 ES2015 类语法 (SyntaxError: bad method definition) 定义静态属性。
  • 我正在使用 Babel,它确实为我生成了代码。这个 babel 是特定的吗?
  • 我猜你使用的是transform-class-properties,它实现了Static Properties proposal
  • 没错,我正在使用这个。那么我的问题有什么解决方案吗?
  • 不,我想不出解决办法。因为,正如你所说,你失去了对超类的引用。

标签: javascript ecmascript-6 es6-class ecmascript-next


【解决方案1】:

这已经在 SO 上讨论过很多次了,但是这个案例可能需要一些解释。一般可以通过this.constructor的实例方法访问静态属性和方法:

class B extends Mixer(A) {
    myMethod() {
      console.log(this.constructor.val);
    }
}

this.constructor === B 的位置,但在从 B 继承的类中情况并非如此。

没有理由直接在B中引用父匿名类,因为val是通过原型链继承而来的。这就是类继承的目的。

【讨论】:

  • 感谢您的更新。我改变了我的问题。
  • 它仍然是this.constructor.val。您可以将其命名为=> class MixinClass extends BaseClass 之类的类并将其称为MixinClass.val,但您甚至不需要这样做。 this.constructor 处理这个问题。
  • 谢谢,this.constructor 解决了这个问题。我想尝试匿名类,所以没有创建一个命名类。
【解决方案2】:

es6 不支持static attribute,我不知道babelstatic val 做了什么,但事实是你测试的东西不基于 es6 规范。所以你可以使用static function来做测试

【讨论】:

  • 我的错。我正在使用 Babel,因此到目前为止还没有意识到这不是标准的一部分。
【解决方案3】:

那是因为类字段是not yet in the ECMAScript standard。如果您 compile it with BabelJS 之后将其粘贴到浏览器控制台,您的代码可以正常工作。

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

【讨论】:

  • 没错,它将在 B 类中可用,作为 B.val,但是如果我需要访问 Mixer 类本身中的 val 怎么办?我不确定 getter 和 setter 方法,因为它正在污染全局命名空间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-08-29
  • 1970-01-01
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 2019-08-02
  • 1970-01-01
相关资源
最近更新 更多