2015-10-27 9 views
7

Node.js 4.2.1 का निम्न कोड चलाते समय:क्या जावास्क्रिप्ट में ईसीएमएस्क्रिप्ट 6 कक्षा से पुरानी शैली की कक्षा का उत्तराधिकारी होना संभव है?

'use strict'; 
 

 
var util = require('util'); 
 

 
class MyClass { 
 
    constructor(name) { 
 
    this.name = name; 
 
    } 
 
} 
 

 
function MyDerived() { 
 
    MyClass.call(this, 'MyDerived'); 
 
} 
 

 
util.inherits(MyDerived, MyClass); 
 

 
var d = new MyDerived();

मैं निम्नलिखित त्रुटि मिलती है:

constructor(name) { 
     ^

TypeError: Class constructors cannot be invoked without 'new' 

मुझे आश्चर्य है अगर यह बिल्कुल संभव है ईसीएमएस्क्रिप्ट 6 कक्षाओं से पुरानी शैली की जावास्क्रिप्ट "कक्षाएं" प्राप्त करें? और, यदि संभव हो, तो कैसे?

उत्तर

7

class वाक्यविन्यास चुनने के बाद वास्तव में कोई रास्ता नहीं है।

समस्या ES6 में है कि विरासत देर initialising super() से वापसी मान, जो new साथ की तरह एक निर्माता कॉल है साथ this कीवर्ड द्वारा किया जाता है। "आवेदन" (.call()) का पुराना मुहावरा वर्तमान में "अनियंत्रित" बाल उदाहरण पर मूल निर्माता काम नहीं करता

क्या आप अभी भी कर सकते हैं करने के लिए "परजीवी विरासत" सहारा है - आप स्पष्ट रूप से, उदाहरण के निर्माण में यह विस्तार करने के लिए होगा, और return यह:

function MyDerived() { 
    var derived = new MyClass('MyDerived'); 
    … // set up properties 
    return derived; 
} 

आप new MyClass के साथ ऐसा करते हैं, तो आप हालांकि प्रोटोटाइप सही ढंग से स्थापित नहीं होगा। उसके लिए, आपको नया ES6 Reflect.construct समारोह है, जो एक वैकल्पिक तीसरे पैरामीटर के रूप में बच्चे को कक्षा लेता है का उपयोग करने की आवश्यकता होगी:

function MyDerived() { 
    var derived = Reflect.construct(MyClass, ['MyDerived'], new.target||MyDerived); 
    … // set up properties 
    return derived; 
} 

इस अतिरिक्त लाभ यह है कि MyDerived किसी भी अधिक new साथ कहा जा की जरूरत नहीं है नहीं है (जब तक आप MyDerived की आपूर्ति करते हैं जब new.target खाली होता है)।

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