JavaScript でインスタンス化された 1 つのオブジェクトに、別のコンストラクターのプロトタイプを継承させることができることはわかっていますが、このような方法constructer.prototype.__proto__ = otherConstructer.prototype
を使用call
して同じことを行うことはできますか?:
function constructor () {
otherConstructor.call(this);
}
JavaScript でインスタンス化された 1 つのオブジェクトに、別のコンストラクターのプロトタイプを継承させることができることはわかっていますが、このような方法constructer.prototype.__proto__ = otherConstructer.prototype
を使用call
して同じことを行うことはできますか?:
function constructor () {
otherConstructor.call(this);
}
いいえ、オブジェクト自体を参照し、すべての実装に存在するわけではない __proto__ プロパティに直接置き換える以外に、プロトタイプを置き換えることはできません。このサンプル コードを見てください。
function B() {
this.someValue = "BBB";
}
B.prototype.testfunc = function() {
console.log("Called from B: someValue =" + this.someValue);
}
function A() {
this.someValue = "AAA";
return B.call(this);
}
A.prototype.testfunc = function() {
console.log("Called from A: someValue =" + this.someValue);
}
var test = new A();
test.testfunc();
// Will output "Called from A: someValue =BBB"
ご覧のとおり、B コンストラクターは正しく呼び出され、オブジェクトのセットアップは A ではなく B から行われていますが、オブジェクトのプロトタイプは依然として A からのものです。もちろん、個々の関数を置き換えることができます。
test.testfunc = B.prototype.testfunc;
test.testfunc();
// Will output "Called from A: someValue =BBB"
これがなぜそうなのかについての詳しい説明が必要な場合は、この質問に対する受け入れられた回答を確認してください。
編集: A オブジェクトの作成時に B.prototype との関連付けはありません。A.prototype.testfunc が定義されないようにコードを変更した場合、A コンストラクターが B を呼び出しても、test.testfunc() を呼び出すと、未定義の例外が発生します。