2

プロトタイプを使用する場合。私たちは次のように使用します

function classA(){

}
function classB(){

}

classB.prototype = new classA();

なぜそのように書く必要があるのですか?なんでじゃないの?

classB.prototype = classA;

プロトタイプを設定した後はclassAです。次に、classB.prototypeをログに記録します。次のようなコンソールログ

関数classA(){}

どう言う意味ですか?classAにメソッドを追加しようとしましたが、classB.prototype.BLABLAを使用してメソッドを呼び出すことができません。

私の英語はあまり良くありません。それで 。うまく説明できるかどうかわかりません。

4

3 に答える 3

3

なんでじゃないの?classB.prototype = classA;

のすべてのインスタンスは、通常は必要なものではない関数classBから継承するためです。のインスタンスは、 [MDN][MDN ]などの関数オブジェクトのすべてのプロパティを継承します。これらは、コンストラクター関数内のインスタンスまたはのプロトタイプに割り当てたプロパティを継承しません。 classAclassB.call .apply classA

なぜそのように書く必要があるのですか?

classBのインスタンスと同じプロパティを持つ各インスタンスが必要ですclassA


しかし、それでもclassB.prototype = new classA();あまり良いアプローチではありません。classAコンストラクターに渡される引数を期待する場合はどうなりますか?

次のように、のプロトタイプからインスタンスをclassB継承させる方がよいでしょう。classA

classB.prototype = Object.create(classA.prototype);
classB.prototype.constructor = classB;

また、コンストラクターでは、新しいインスタンスで親コンストラクターを呼び出しています。

function classB(){
    classA.apply(this, arguments);
}

参照Object.create

于 2012-06-19T10:59:45.187 に答える
1

プロトタイプに関数selfではなくインスタンスが必要な理由

これにより、子クラスを親から拡張したり、子クラスで親クラスのものを取得したりできます。親クラスからデータを取得する他の言語と同じ概念であり、子クラスはコンストラクター関数でそのインスタンスを作成する必要があります。

インスタンスを作成しないと、子クラスで親クラスのメンバーを取得することはできません。

観察:

function classA(){
  this.foo = function(){ alert('i am in parent'); }
}
function classB(){

}

classB.prototype = new classA();

var b = new classB;
b.foo(); // alerts "foo"

と:

function classA(){
  this.foo = function(){ alert('i am in parent'); }
}
function classB(){

}

classB.prototype = classA();

var b = classB;
b.foo(); // error: Object # has no method 'foo'
于 2012-06-19T10:56:09.197 に答える
1

プロトタイプが関数ではなくオブジェクトであるという理由だけで。

classAは関数なので、プロトタイプとしては使用しないでください。classAオブジェクトを取得するようにのインスタンスを作成します。

関数は実際にはオブジェクトでもあるため、関数をプロトタイプとして使用することもできますが、それは混乱を招くだけです。

于 2012-06-19T11:01:41.540 に答える