2016-03-03 43 views
6

ile tanımlanmamış şu anda ES6, node.JS ve Babel ile birden çok dosya devralma yapmaya çalışıyorum (Ben Babel kullanarak kodu ES6 dönüştürmek için kullanıyorum ES5'e 'neden Düğüm şu an ES6'yı uygulamaz. Farklı dosyaları "bağlamak" için ithalat/ihracat kullanıyorum. AslındaTypeError: Süper ifade boş olmalı veya bir işlev değil, Babeljs

Ben: Üst sınıf (File 1)

export class Point 
{ 
    constructor(x, y) 
    { 
     this.x = x; 
     this.y = y; 
    } 

    toString() { 
     return '(' + this.x + ', ' + this.y + ')'; 
    } 
} 

Ve: Çocuk Sınıfı (Dosya 2)

import Point from './pointES5' 

export class ColorPoint extends Point 
{ 
    constructor(x, y, color) 
    { 
     super(x, y); 
     this.color = color; 
    } 

    toString() { 
     return super.toString() + ' in ' + this.color; 
    } 
} 

Ve ana Ana (Dosya 3)

import Point from './pointES5' 
import ColorPoint from './colorpointES5' 

var m_point = new Point(); 
var m_colorpoint = new ColorPoint(); 

console.log(m_point.toString()); 
console.log(m_colorpoint.toString()); 

Bunu yapmak için, Ebeveyn ve Çocuk'tan toString() yöntem çağrılarını test etmek için yapıyorum.
Sonra Babel'i kullanarak kodu ES6'dan ES5'e dönüştürüyorum ve her parçayı ayrı ayrı test ediyorum, eğer tamamsa ya da yapmadıysa.
- Point (Ana) iyi ve hatasız olarak çalıştır.
- COLORPOINT (Çocuk) tamamen çalıştırın ve atmayın:

TypeError: Super expression must either be null or a function, not undefined

StackTrace ilk satırı: Sinir bozucu nedenidir

function _inherits(subClass, superClass) { if (typeof superClass !== 'function' && superClass !== null) { throw new TypeError('Super expression must either be null or a function, not ' + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.proto = superClass; } (It comes from the ES5 converted code (Babelified), and I can post it entirely if it's needed).

bu kod çok basit ... Ancak, hataya neden olan şeyi göremiyorum.

Ben Babil değişik versiyonlarını (5, 5.8, 6) ancak hiçbir fark yoktur ...

Ben yanlış yaptım deneyin?

PS: Söylemeyi unuttum: Sadece tek bir dosyada bunu yaptığımda ÇALIŞIR. Ama dosyası tarafından yalnızca bir sınıf ... olması benim için gerçekten önemli

cevap

24

Kişisel ihracat İçe aktarma eşleşmiyor:

export class Point 
// and 
import Point from './pointES5' 

adlandırılmış bir sembolü dışa ancak varsayılan ithal ediyoruz, bu yüzden ikinci dosyanızda yanlış nesneyi Point olarak alacağım.

yapabilirsiniz kullanım ya:

export default class Point 
birinci sınıf dosyasında

veya ikinci dosyada

import {Point} from './pointES5'; 

doğru referansı getirilemedi. Dosya başına tek sınıf düzenine gidecekseniz, öneriyi öneririm. Genellikle dışa aktarılan tek bir sınıfa sahip olursunuz, bu nedenle varsayılan değerlere sahip olmak mantıklıdır. lanet Vay

// in Point 
module.exports = { 
    Point: Point 
}; 

// in ColorPoint 
var Point = require('./pointES5'); // will point to *the whole object* 

class SubPoint extends Point 
+0

:

Şimdi ne var eşdeğerdir!"Varsayılan" anahtar kelimenin ne olduğunu ve şimdi ne için kullanıldığını biraz daha anlıyorum! Yardımın için çok teşekkür ederim ! Mükemmel çalışıyor! : D – Aethyn

+0

Paketleme için webpack'i kullanmanız durumunda, websitesi 2.0 ağacının performans amaçları için kullanacağı @ssube tarafından önerilen ikinci yaklaşımı kullanmanızı öneririz: http://2ality.com/2015/12/webpack -ağacı-shaking.html –

İlgili konular