为什么只显示用class.prototype定义的方法?

时间:2017-07-24 12:28:13

标签: javascript ecmascript-6

我有以下代码,大大减少了:

class Animal {
  speak() {}
}

Animal.prototype.speaklouder = function() {};

for (const key in new Animal()) {
  console.log("key", key);
}

这在节点6.11.0中产生

key speaklouder

为什么?我认为类语法只是糖?我希望函数说话也被列为属性。

1 个答案:

答案 0 :(得分:1)

类属性不可枚举,请参阅ecma-262 6.0 14.5.14:

  • 21。对于每个ClassElement m,按顺序排列
  • 一个。如果m的IsStatic为假,则
  • 我。设状态是使用参数proto和false对m执行PropertyDefinitionEvaluation的结果。“

http://www.ecma-international.org/ecma-262/6.0/#sec-runtime-semantics-classdefinitionevaluation

PropertyDefinitionEvaluation的第二个参数是enumerable

http://www.ecma-international.org/ecma-262/6.0/#sec-method-definitions-runtime-semantics-propertydefinitionevaluation

例如,您可以检查babel输出中的_createClass函数:

function defineProperties(target, props) {
    for (var i = 0; i < props.length; i++) {
        var descriptor = props[i];
        // ...
        descriptor.enumerable = descriptor.enumerable || false;
        // ...
        Object.defineProperty(target, descriptor.key, descriptor);
    }
}

function _createClass(Constructor, protoProps, staticProps) {
    if (protoProps) defineProperties(Constructor.prototype, protoProps);
    // ...
    return Constructor;
}

_createClass(Animal, [{
    key: "speak",
    value: function speak() {}
}]);

https://babeljs.io/repl/#?babili=false&evaluate=true&lineWrap=false&presets=es2015%2Cstage-2&targets=&browsers=&builtIns=false&debug=false&code_lz=MYGwhgzhAECCB2BLAtmE0DeBYAUNaEADgKZgDWAFAJSYC-u9OuCKaAdIQE4D2ALnwE8SbIqTIhuAVwAmxTtAC80AGaT4wXom7xqdANy5cy7vIrBtEXtDLEB0RPGjxiAdzhJUIajWx5o5-AhuEGI2CQBzCgAiGwEogBprWyoDHEYgA

请参阅:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty