2016-03-24 8 views
5

में ऑब्जेक्ट से विस्तारित कक्षा को तुरंत चालू करते समय तर्क पारित नहीं करता है नीचे दिए गए कोड क्रोम वी 8 में गलत लॉग है लेकिन बैबेल में लॉग इन करता है। feedback from Google ने कहा कि झूठी लॉगिंग यह है कि बैबेल की एक बग सत्य लॉगिंग करते समय यह होना चाहिए। मैंने ES6 चश्मे में देखा और अभी भी इसके पीछे तंत्र को समझ नहीं सका। किसी भी विचार की सराहना की जाएगी!सुपर() क्रोम वी 8

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

मुझे उस बग की प्रतिक्रिया को समझ में नहीं आता है; एक 'सुपर()' कॉल को निश्चित रूप से एक तर्क सूची शामिल करने की अनुमति है, और ऑब्जेक्ट कन्स्ट्रक्टर को इसके तर्क पर ध्यान देना चाहिए। – Pointy

+1

यह एक क्रोमियम बग है। मैंने माइक्रोसॉफ्ट एज पर परीक्षण किया है। यह 'सच 'देता है। – Lewis

उत्तर

8

वास्तव में उस क्रोम बग पर आपको मिली प्रतिक्रिया सही है। ईएस 5 से ES6 तक कुछ चीजें यहां बदल गईं। बेबेल वास्तव में इसके बारे में कुछ भी नहीं कर सकता है, और एज ने अभी तक इसे नहीं बदला है। या यह छोटे काल के लिये :-)

है ES5 new Object(value) कल्पना का कहना है कि यह एक वस्तु मूल्य कि में पारित हो जाता है देता है।

ES6 में, आप [[construct]] of builtins और Object(value) function पर वर्गों की जांच करने के लिए है। और उस के पहले बयान

तो NEWTARGET है न undefinedहै और न ही सक्रिय समारोह, तो है
वापसी OrdinaryCreateFromConstructor (NEWTARGET, "% ObjectPrototype%")।

तो अगर आप new Object({…}) कर रहे हैं, यह अभी भी {…} तर्क वापस आ जाएगी। लेकिन जब आप, super() से या Reflect.construct(Object, [{…}], MyCustomTarget) के रूप में यह बुला रहे हैं ताकि new.target, Object नहीं है तो आप बस MyCustomTarget.prototype से निर्मित एक नई वस्तु मिल जाएगा, और तर्क को नजरअंदाज कर दिया जाता है।

+0

अच्छा खोज। आश्चर्यचकित होना चाहिए कि 5-> 6 का परिवर्तन क्यों है, क्योंकि आप वास्तव में ओपीएस कोड के अनुसार काम करने की उम्मीद करेंगे। –

+0

@JamesThorpe: ठीक है, यह वास्तव में * ES5 से * नहीं बदला गया था, क्योंकि ES5 में सुपर कॉल/new.target नहीं था। सादा 'नए ऑब्जेक्ट (...) का आविष्कार करना अभी भी हमेशा के रूप में काम करता है। यह सिर्फ उप-वर्गों से है, 'ऑब्जेक्ट' * सामान्य "से अलग * काम करता है। – Bergi

+0

दाएं, हाँ - यह समझ में आता है। –

संबंधित मुद्दे