2017-11-08 6 views
0

私はプロトタイプについてよく知っていますが、コンパイル時にどのように見えるかをテストし、プロトタイプのアプローチと比較することで、クラスの仕組みを理解しようとしています。どのようにjavascriptのクラスインスタンスにクラスを拡張するには?

プロトタイプを使用すると、私はObject.setPrototypeOfメソッドでオブジェクトを別のオブジェクトに "拡張"できます。 2番目の引数として[Object]型のものを渡しても動作しますが、とextendsキーワードを使用すると、別の[クラス]タイプのオブジェクトのみが必要です。

これは作業prototype様なアプローチである:だから

function Citizen(country){ 
    this.country = country; 
} 

function Student(subject){ 
    this.subject = subject; 
} 


Object.setPrototypeOf(Student.prototype,new Citizen('Poland')); 

var student = new Student('IT'); 
console.log(student.subject); //IT 
console.log(student.country); //Poland 

、私は市民instanceではなくCitizen自体(コンストラクタ)に学生を "拡張します"。そしてそれはうまく動作します。 Citizenインスタンス(student.contry)のプロパティにアクセスできます。

classextendsで同じ結果を得るにはどうすればよいですか? 私は以下のコードのようなものを実現したいが、それはエラーを投げる:Class extends value #<Citizen> is not a constructor or null、純粋なプロトタイプの使用法ほど柔軟ではないようだ。

class Citizen { 
    constructor(subject){ 
    this.subject = subject; 
    } 
} 

class Student extends new Citizen('USA') { 
    //this expects CLASS rather than instance of the class 
    //Error: Class extends value #<Citizen> is not a constructor or null 
    constructor(subject){ 
    this.subject = subject; 
    } 
} 

var student = new Student('law'); 

console.log(student.subject); //law 
+0

- [いいえ、そうでない](https://stackoverflow.com/questions/12592913/what-is-the "*そして、それだけで正常に動作します*。" - ここに新しいキーワードを使用する) – Bergi

+0

これに 'Object.setPrototypeOf'を使わないでください。あなたがどこからそれを得たか分からない。 – Bergi

+2

"*' class'は、純粋なプロトタイプを使うほど柔軟ではないようです。クラスは比較的堅牢なフレームワークを提供しています。 – Bergi

答えて

1

How can I get the same result with the class and extends?

あなたは(-ish)することはできません。しかしもっと重要なのは、あなたはしてはいけません。プロトタイプアプローチを使用しても、あなたはまだそうすべきではありません。あなたのプロトタイプのアプローチは、次のようになります。

Object.setPrototypeOf(Student.prototype, Citizen.prototype); 

と同様に、クラスのアプローチは次のようになります。あなたはあなたの学生がハードコードされ、国を持ちたい何らかの理由で

class Student extends Citizen 

そして場合を、そしてあなたを「このようにそれを行うD:

class Student extends Citizen { 
    constructor(subject) { 
     super("USA"); 
     this.subject = subject; 
    } 
} 
関連する問題