JavaScript パターンと呼ばれる本を読んでいますが、その人が混乱していると思う部分が 1 つあります。
男は実際に本の中で klass デザインパターンにたどり着き、そこで彼はそれを少しずつ開発しました。彼は最初に問題を提示します。
function inherit(C, P) {
C.prototype = P.prototype;
}
彼は言います:
「これにより、すべてのオブジェクトが実際に同じプロトタイプを共有するため、プロトタイプチェーンのルックアップが短く高速になります。しかし、継承チェーンのどこかにある子または孫がプロトタイプを変更すると、すべての親と祖父母に影響するため、これはドローバックでもあります。」
しかし、私は実際に子のプロトタイプ say() を変更しようとしましたが、それは親には影響しませんでした。実際、子はまだ親を指していて、同じ名前の独自のプロトタイプを完全に無視していました。別のメモリ位置を指しているため、これは理にかなっています. では、その男はどうしてそのようなことを言うことができますか?以下は私の主張を証明しています:
function Parent(){}
Parent.prototype.say = function () {
return 20;
};
function Child(){
}
Child.prototype.say = function () {
return 10;
};
inherit(Child, Parent);
function inherit(C, P) {
C.prototype = P.prototype;
}
var parent = new Parent();
var child = new Child();
var child2 = new Child()
alert(child.say(); //20
alert(parent.say()); //20
alert(child2.say()); //20
子や孫がプロトタイプを変更することは不可能です。
これは私の 2 番目のポイントにつながります。彼は、親プロトタイプを誤って継承チェーンの下に変更する可能性の問題 (私には再現できません) の解決策は、親プロトタイプと子プロトタイプの間の直接的なリンクを断ち切ると同時に、プロトタイプ チェーンの恩恵を受けることだと言います。彼は解決策として次のことを提案しています。
function inherit(C, P) {
var F = function () {};
F.prototype = P.prototype;
C.prototype = new F();
}
問題は、これが他のパターンと同じ正確な値を出力することです:
function Parent(){}
Parent.prototype.say = function () {
return 20;
};
function Child(){
}
Child.prototype.say = function () {
return 10;
};
inherit(Child, Parent);
function inherit(C, P) {
var F = function () {};
F.prototype = P.prototype;
C.prototype = new F();
}
var parent = new Parent();
var child = new Child();
var child2 = new Child()
alert(child.say(); //20
alert(parent.say()); //20
alert(child2.say()); //20
空の関数がどういうわけかリンクを壊すのは意味がありません。実際、子は F を指し、F は親のプロトタイプを指します。したがって、それらはすべて同じメモリ位置を指しています。これは上記で実証されており、最初の例とまったく同じ値が出力されます。この著者が何を実証しようとしているのか、また、なぜ彼が私には理解できず、再現できないという主張をするのか、私にはわかりません。
返信ありがとうございます。