例えば:
function A(){}
function B(){}
B.prototype = new A();
クラスBがクラスAを継承しているかどうかを確認するにはどうすればよいですか?
例えば:
function A(){}
function B(){}
B.prototype = new A();
クラスBがクラスAを継承しているかどうかを確認するにはどうすればよいですか?
次のことを試してください。
ChildClass.prototype instanceof ParentClass
直接継承をテストできます
B.prototype.constructor === A
間接継承をテストするには、次を使用できます。
B.prototype instanceof A
(この2番目の解決策は、最初にNirvana Tikkuによって提供されました)
2017年に戻る:
それがあなたのために働くかどうかを確認してください
ParentClass.isPrototypeOf(ChildClass)
シャドウイングに対する保護が必要な場合の代替手段:
const isPrototypeOf = Function.call.bind(Object.prototype.isPrototypeOf);
// Usage:
isPrototypeOf(ParentClass, ChildClass); // true or false
落とし穴:instanceof
複数の実行コンテキスト/ウィンドウを使用すると、期待どおりに機能しないことに注意してください。§§を参照してください。
また、https://johnresig.com/blog/objectgetprototypeof/によると、これは次と同じ代替実装ですinstanceof
。
function f(_, C) { // instanceof Polyfill
while (_ != null) {
if (_ == C.prototype)
return true;
_ = _.__proto__;
}
return false;
}
クラスを直接チェックするように変更すると、次のようになります。
function f(ChildClass, ParentClass) {
_ = ChildClass.prototype;
while (_ != null) {
if (_ == C.prototype)
return true;
_ = _.__proto__;
}
return false;
}
instanceof
obj.proto
それ自体がであるかどうかをチェックしますf.prototype
。
function A(){};
A.prototype = Array.prototype;
[]instanceof Array // true
と:
function A(){}
_ = new A();
// then change prototype:
A.prototype = [];
/*false:*/ _ instanceof A
// then change back:
A.prototype = _.__proto__
_ instanceof A //true
と:
function A(){}; function B(){};
B.prototype=Object.prototype;
/*true:*/ new A()instanceof B
等しくない場合は、チェックでprotoがproto of protoと交換され、次にproto of protoofprotoというように交換されます。したがって:
function A(){}; _ = new A()
_.__proto__.__proto__ = Array.prototype
g instanceof Array //true
と:
function A(){}
A.prototype.__proto__ = Array.prototype
g instanceof Array //true
と:
f=()=>{};
f.prototype=Element.prototype
document.documentElement instanceof f //true
document.documentElement.__proto__.__proto__=[];
document.documentElement instanceof f //false
B.prototype = new A()
これは確かにJavaScriptでプロトタイプをチェーンする方法ではないので、私はサイモンが彼の質問で意味したとは思いません。
BがAを拡張すると仮定して、Object.prototype.isPrototypeOf.call(A.prototype, B.prototype)