2016-03-24 4 views
5

Der folgende Code protokolliert in Chrome V8 "false", meldet sich jedoch in Babel als "true" an. Die feedback from Google sagte, dass die Protokollierung falsch ist, wie es sein soll, während die Protokollierung wahr ist, ist ein Fehler von Babel. Ich schaute in die ES6 Spezifikationen und konnte immer noch nicht den Mechanismus dahinter verstehen. Irgendwelche Gedanken würden geschätzt werden!Super() übergibt keine Argumente beim Instanziieren einer aus Objekt in Chrome V8 erweiterten Klasse

class NewObj extends Object{ 
    constructor(){ 
    super(...arguments); // In V8, after arguments === [{attr: true}] 
         // is passed as parameter to super(), 
         // this === NewObj{} in V8; 
         // but this === NewObj{attr: true} in Babel. 
    } 
} 
var o = new NewObj({attr: true}); 
console.log(o.attr === true); 
+2

Ich verstehe die Antwort auf diesen Fehler nicht; Ein 'super() 'Aufruf darf ganz gewiß eine Argumentliste enthalten, und der Object Konstruktor sollte auf sein Argument achten. – Pointy

+1

Es ist ein Chromium Bug. Ich habe es auf Microsoft Edge getestet. Es gibt "wahr" zurück. – Lewis

Antwort

8

In der Tat ist das Feedback, das Sie zu diesem Chrome-Bug bekommen haben, korrekt. Einige Dinge haben sich von ES5 zu ES6 geändert. Babel kann nicht wirklich etwas dagegen tun, und Edge hat es noch nicht geändert. Oder es ist ein Erratum :-)

Die ES5 new Object(value) Spezifikation sagt, dass es ein Objekt Wert zurückgibt, die in übergeben wird.

In ES6, müssen Sie die Abschnitte über [[construct]] of builtins überprüfen und die Object(value) function. Und die erste Anweisung das ist

Wenn NewTarget weder undefinednoch die aktive Funktion, dann
Zurück OrdinaryCreateFromConstructor (NewTarget "% ObjectPrototype%").

Also, wenn Sie new Object({…}) tun, wird es immer noch das {…} Argument zurückgeben. Aber wenn Sie es von super() oder Reflect.construct(Object, [{…}], MyCustomTarget) anrufen, so dass new.target nicht Object ist, dann erhalten Sie nur ein neues Objekt aus MyCustomTarget.prototype konstruiert, und das Argument wird ignoriert.

+0

Gut finden. Ich muss mich wundern, warum der Wechsel von 5-> 6 ist, da man eigentlich erwarten würde, dass es nach dem OP-Code funktioniert. –

+0

@JamesThorpe: Nun, ES * änderte * nicht wirklich von ES5, weil ES5 keine Super Calls/new.target hatte. "Neues Objekt (...)" aufzurufen, funktioniert immer noch wie immer. Es ist nur so, dass 'Objekt' aus Unterklassen * anders * als" normal "funktioniert. – Bergi

+0

Richtig, ja - das macht Sinn. –

Verwandte Themen