2017-09-30 51 views
1

创建的类我创建了一个类按照官方的例子从MDN(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ClassesES6:访问静态成员变量从密新

这里是我的代码

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 
    } 
} 
+0

您无法使用ES2015类语法('SyntaxError:bad method definition')定义静态属性。 – PeterMader

+0

我使用的是Babel,它确实为我生成了代码。这个babel具体吗? –

+0

我想你正在使用[transform-class-properties](https://babeljs.io/docs/plugins/transform-class-properties/),它实现了[Static Properties proposal](https:// babeljs)。 io/docs/plugins/transform-class-properties /) – PeterMader

回答

1

这已经在无数次讨论过,但这种情况可能需要一些解释。一般来说,静态属性和方法可以从实例方法来访问与this.constructor

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

this.constructor === B,但这不会是从B继承的类属实。

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

+0

感谢您的更新。我改变了我的问题。 –

+0

它仍然是'this.constructor.val'。你可以像'=>类MixinClass extends BaseClass'一样将其命名为类,并将其称为'MixinClass.val',但你甚至不需要。 'this.constructor'处理这个。 – estus

+0

谢谢,this.constructor解决了这个问题。我想尝试匿名类,所以没有命名。 –

0

这是因为类字段是not yet in the ECMAScript standard。如果您的代码compile it with BabelJS以后再粘贴到浏览器控制台,您的代码工作得很好。

class B extends Mixer(A) { 
    myMethod() { 
     console.log(B.val); // logs 10 
    } 
} 

如果您需要使用ES2015,快速技巧是使用setter和getters。

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 
+0

真的,它将在B类中用作B.val,但如果我需要访问Mixer类中的val,该怎么办? 我不确定getters和setters方法,因为它污染了全局名称空间。 –

0

的ES6不支持static attribute,我不知道什么babelstatic val做,但事实是,你不要测试上ES6规范的基础。因此,您可以使用static function进行测试

+0

我的不好。我正在使用Babel,因此没有意识到这不是目前的标准的一部分。 –