instanceof演算子は、コンストラクターのパブリックprototype
プロパティがオブジェクトの[[Prototype]]
チェーン上にあるかどうかをチェックするだけです。チェーンを壊す 1 つの方法は、コンストラクターのプロトタイプを変更することです。
function Base() {}
var base = new Base();
alert( base instanceof Base); // true
Base.prototype = {};
alert( base instanceof Base); // false
alert( base instanceof Object); // true
2 番目のアラートは false です。これは、新しいアラートがチェーンBase.prototype
上にないためです(元のアラートはまだ存在します)。まだあることに注意してください。上記は、演算子が特に有用であると見なされない理由の 1 つです。[[Prototype]]
base
Object.protoyype
instanceof
やろうとしていることを行うには、[[Prototype]]
後で変更できないため、オブジェクトの構築時にチェーンを作成する必要があります。
Derived.prototype = new Base();
var base = new Derived();
alert(base instanceof Base); // true
alert(base instanceof Derived); // true
編集
要件は次のとおりです。
- オブジェクト obj はコンストラクタ Base で作成されます。obj instanceof Base は true を返します。
示されているように、それは必ずしも真実ではありません。特定の値を返すことに依存する戦略がある場合は、instanceof
明確な利点のない設計に (おそらく不合理な) 制約を課していることになります。
2
. obj が Derived から構築されたかのように見えるように、obj のプロトタイプを変更したいと考えています。つまり、欲しい
•obj は Derived のメソッドへのアクセスを取得します
これを行うには、Base.prototype を Derived のインスタンスにするか (示されているように)、プロパティを Base.prototype にコピーします。
•obj instanceof true を返すように派生
これを行うには、 Baseのインスタンスを作成する前にDerivedBase.prototype
のインスタンスを作成します。
インスタンスの作成後にチェーンを変更することはできません。instanceof
制約を削除するDerived.prototype
と、 にコピーするだけで のメソッドを追加できますBase.prototype
。もう 1 つの方法は、callまたはapplyを使用することです。
Derived.prototype.someMethod.call(base, ...);
しかし、あなたは不可能なことをしようとしていると思います。