2016-03-24 3 views
5

以下のコードはChrome V8ではfalseを記録しますが、Babelではtrueを記録します。 feedback from Googleは、falseを記録することは、どのように記録されるべきかということであり、trueを記録することはBabelのバグです。私はES6の仕様を見て、これの背後にあるメカニズムをまだ理解できませんでした。どんな考えにも感謝します!Chrome V8でObjectから拡張されたクラスをインスタンス化するときにsuper()が引数を渡さない

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

私はそのバグに対する応答を理解していません。 'super()'コールには引数リストを含めることが最も確実であり、Objectコンストラクタはその引数に注意を払うことになっています。 – Pointy

+1

これはChromiumバグです。私はMicrosoft Edgeでテストしました。 'true'を返します。 – Lewis

答えて

8

実際、Chromeのバグのフィードバックは正しいです。ここではES5からES6に変わったことがあります。バベルは本当にそれについて何もすることはできませんし、エッジはそれをまだ変更していません。それともES5 new Object(value)仕様は、それが渡されたオブジェクトの値を返すことを言う。ES6で

:-)

エラータだ、あなたは[[construct]] of builtinsObject(value) function上のセクションを確認する必要があります。そして、それの最初の文は、

NewTargetがある場合もないundefinedもアクティブな機能、ある
戻りOrdinaryCreateFromConstructorNewTarget、 "%のObjectPrototypeの%")。

new Object({…})を実行しても、引き続き{…}引数が返されます。しかし、super()またはReflect.construct(Object, [{…}], MyCustomTarget)から呼び出すと、new.targetObjectではないので、MyCustomTarget.prototypeから構築された新しいオブジェクトを取得するだけで、引数は無視されます。

+0

Good find。あなたが実際にOPコードに従って動作すると期待しているので、なぜ5から6への変更が不思議に思うのですか? –

+0

@JamesThorpe:ES5はスーパーコール/ new.targetを持っていなかったので、実際にES5から*変更していませんでした。 'new Object(...)'を明示的に呼び出すことは、常にそうであるように動作します。それはサブクラスからのもので、 'Object'は「normal」とは違って動作します。 – Bergi

+0

そうです、それは意味があります。 –

関連する問題