私はプロトタイプについてよく知っていますが、コンパイル時にどのように見えるかをテストし、プロトタイプのアプローチと比較することで、クラスの仕組みを理解しようとしています。どのように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
)のプロパティにアクセスできます。
class
とextends
で同じ結果を得るにはどうすればよいですか? 私は以下のコードのようなものを実現したいが、それはエラーを投げる: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
- [いいえ、そうでない](https://stackoverflow.com/questions/12592913/what-is-the "*そして、それだけで正常に動作します*。" - ここに新しいキーワードを使用する) – Bergi
これに 'Object.setPrototypeOf'を使わないでください。あなたがどこからそれを得たか分からない。 – Bergi
"*' class'は、純粋なプロトタイプを使うほど柔軟ではないようです。クラスは比較的堅牢なフレームワークを提供しています。 – Bergi