2017-07-24 2 views
4

ich den folgenden Code haben, stark reduziert:warum zeigt für ... nur Methoden, die mit class.prototype definiert sind?

class Animal { 
 
    speak() {} 
 
} 
 

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

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

Dies erzeugt in Knoten 6.11.0,

key speaklouder 

Warum ist das so? Ich dachte, die Klassensyntax ist nur Zucker? Ich würde erwarten, dass die Funktion auch als Attribut aufgeführt wird.

+0

Mögliche Duplikat https://stackoverflow.com/questions/30881632/es6-iterate-over-class-methods - ES6 Methoden sind nicht zählbare –

+1

@ user2311517 Ich habe keine konkrete Dokumentation gefunden, aber nach meinem Verständnis sind Methoden der Klasse nicht aufzählbar. Sie können ** [hier] (https://jsfiddle.net/9oo5u457/) ** überprüfen. Sie können sich auch auf ** [Spezifikationen] beziehen (http://www.ecma-international.org/ecma-262/6.0/#sec-functioninitialize) ** – Rajesh

Antwort

1

Klasseneigenschaften sind nicht zählbare, ECMA-262 6.0 14.5.14: a

  • 21. Für jede ClassElement m in der Reihenfolge von Methoden,
  • . Wenn IsStatic von m falsch ist, dann
  • i. Lassen Status das Ergebnis PropertyDefinitionEvaluation für m mit Argumenten Proto und falsch von performing „

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

Zweiter Parameter von PropertyDefinitionEvaluation ist enumerable.

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

Für ein Beispiel, können Sie Überprüfen Sie die _createClass Funktion in der Babel-Ausgabe:

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

See:

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

Verwandte Themen