2015-10-27 12 views
7

node.js 4.2.1 aşağıdaki kodu çalıştırarak: aşağıdaki hatayı alıyorumEski stil sınıfını ECMAScript 6 sınıfından JavaScript'te mi almak mümkün müdür?

'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();

: hiç mümkün istiyorsa

constructor(name) { 
     ^

TypeError: Class constructors cannot be invoked without 'new' 

acaba ECMAScript 6 sınıflarından eski stil JavaScript "sınıfları" devralın mı? Ve mümkünse nasıl olacak?

cevap

7

class sözdizimine girdikten sonra gerçekten bir çıkış yolu yoktur.

sorun ES6 bu miras new olduğu gibi bir yapıcı çağrıdır super() dönüş değeri ile this anahtar kelimeyi geç initialising yapılır olduğunu. Şu anda "başlatılmamış" alt öğe üzerinde ana kurucu "uygulama" (.call()) eski deyim, artık çalışmaz.

Ne yapmak hala yapabilirsiniz "asalak miras" başvurmak - bu açıkça bunu, örneği inşa uzatmak gerekecek ve return:

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

Eğer new MyClass ile bunu yaptığınızda, Ancak prototipin doğru şekilde kurulmasını sağlamaz. Bunun için, isteğe bağlı bir üçüncü parametre olarak çocuk sınıfını alır yeni ES6 Reflect.construct fonksiyonunu kullanmanız gerekecektir:

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

Bu MyDerived artık new ile çağrılacak ihtiyacı olmadığını ek yararı vardır (new.target boş olduğunda MyDerived sağladığınız sürece).

İlgili konular