2016-03-24 16 views
5

以下代碼在Chrome V8中記錄爲false,但在Babel中記錄爲true。 feedback from Google表示記錄錯誤是它應該如何記錄真實是巴貝爾的錯誤。我研究了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

這是一個鉻錯誤。我已經在Microsoft Edge上進行了測試。它返回'true'。 – Lewis

回答

8

事實上,您對Chrome bug的反饋是正確的。有些事情從ES5改爲ES6。巴貝爾無法對此做任何事情,Edge並沒有改變它。或者它:-)

一個勘誤的ES5 new Object(value)規範說,它返回在傳遞的對象值。

在ES6,你必須檢查[[construct]] of builtinsObject(value) function的章節。與第一語句是

如果NEWTARGET既不是undefined也不能動作用,然後
返回OrdinaryCreateFromConstructorNEWTARGET 「%ObjectPrototype%」)。

所以如果你在做new Object({…}),它仍然會返回{…}參數。但是當你從super()Reflect.construct(Object, [{…}], MyCustomTarget)調用它,以便new.target不是Object,那麼你只會得到一個從MyCustomTarget.prototype構造的新對象,並且該參數被忽略。

+0

不錯的發現。不得不想知道爲什麼從5到6的變化,因爲你真的希望它按照OPs代碼工作。 –

+0

@JamesThorpe:嗯,它並沒有真正*從ES5改變,因爲ES5沒有超級調用/ new.target。顯然調用'new Object(...)'仍然一如既往。只是從子類來看,「對象」與「正常」不同。 – Bergi

+0

對,是的 - 這是有道理的。 –

相關問題