90

例えば:

function A(){}
function B(){}
B.prototype = new A();

クラスBがクラスAを継承しているかどうかを確認するにはどうすればよいですか?

4

5 に答える 5

167

次のことを試してください。

ChildClass.prototype instanceof ParentClass
于 2013-01-23T17:52:29.940 に答える
39

直接継承をテストできます

B.prototype.constructor === A

間接継承をテストするには、次を使用できます。

B.prototype instanceof A

(この2番目の解決策は、最初にNirvana Tikkuによって提供されました)

于 2013-01-23T17:50:31.650 に答える
27

2017年に戻る:
それがあなたのために働くかどうかを確認してください

ParentClass.isPrototypeOf(ChildClass)

シャドウイングに対する保護が必要な場合の代替手段:

const isPrototypeOf = Function.call.bind(Object.prototype.isPrototypeOf);

// Usage:
isPrototypeOf(ParentClass, ChildClass); // true or false
于 2017-08-13T20:14:22.287 に答える
2

落とし穴: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;
}


サイドノート

instanceofobj.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
于 2017-08-13T04:06:41.410 に答える
1

B.prototype = new A()これは確かにJavaScriptでプロトタイプをチェーンする方法ではないので、私はサイモンが彼の質問で意味したとは思いません。

BがAを拡張すると仮定して、Object.prototype.isPrototypeOf.call(A.prototype, B.prototype)

于 2018-10-10T16:49:27.523 に答える