2016-12-06 4 views
3

私は、例のクラスを持っている:JS ECMAScript 6でコンストラクタが継承されていますか?

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

    //... 
} 

そして、私はこのように継承されたクラス作ります:このような

class Dog extends Something{ 
    constructor(name){ 
     this.name = name; 
    } 

    //... 
} 

ウィル犬のコンストラクタを見て?

constructor(x, y, name){ 
    this.x = x; 
    this.y = y; 
    this.name = name; 
} 

そうでない場合、このように動作させることは可能ですか?

+0

あなたは明示的に ''スーパー(x、y)のような犬のコンストラクタでsuper'を使用して、それを作成する必要があります; ' – Andrey

+0

あなたはこのコードを試してみましたか? 'super'を抜けたので例外がスローされます。 – loganfsmyth

答えて

7

は、JSのECMAScript 6に継承されたコンストラクタですか?

そうでもない、ありません。しかし、コンストラクタをまったく提供しなければ、JavaScriptエンジンは継承されたコンストラクタのように動作するデフォルトを提供します。このような(あなたの例に関連していない、あなたは Dogでコンストラクタを提供してきました。)

ウィル犬のクラスを見て?

いいえ。コンストラクタをに定義しているため、JavaScriptエンジンは何も行いません。それはDogのコンストラクタをし、それがSomething呼び出す必要があり "の定義super経由秒(そして、あなたがsuperを呼び出すまで、あなたがthisを使用することはできません)するのはあなた次第です。

あなたDogコンストラクタはxyを受け入れるか、独自のをハードコーディング(または、それが得るん引数からそれらを導く)のいずれかに必要があるでしょう:

は彼らを受け入れ:

class Dog extends Something{ 
    constructor(name, x, y) { 
     super(x, y); 
     this.name = name; 
    } 

    //... 
} 

ハードコーディング:

// Accepting them: 
class Dog extends Something{ 
    constructor(name) { 
     super(42, 57); 
     this.name = name; 
    } 

    //... 
} 

(もちろん、xまたはyのみを受け入れますそして打ち/他のものを導き出す。)


あなたはadds one for you、全くJavaScriptエンジンをconstructorを指定しない場合。基底クラスの場合

が、それは次のようになります。派生クラスの

constructor() { 
} 

、それは次のようになります。

constructor(...args) { 
    super(...args); 
} 

私はそれが少し継承されたようなものだと言う理由後者の方であることデフォルトのコンストラクタが引数を受け付けず、引数なしでsuperを呼び出すJavaやC#のような言語とは異なり、JavaScriptのデフォルトは受け取るすべての引数を渡します。

+0

ありがとう、これは役に立ちました、今私はそれを理解しています。あなたの答えを私がそれをやることができるようになると助けになります(約10分) –

1

あなたは、目的の動作を得るために

super(x, y); 

を使用して明示的に基底クラスのコンストラクタを呼び出す必要があります。

0

それはECMAScriptの2015年、行います

class Animal { 
    constructor() { 
    console.log("Hello"); 
    } 
} 

class Dog extends Animal {} 

var d = new Dog(); // Prints "Hello" 
関連する問題