Par exemple:
function A(){}
function B(){}
B.prototype = new A();
Comment puis-je vérifier si la classe B hérite de la classe A?
essayez ceci B.prototype instanceof A
Vous pouvez tester l'héritage direct avec
B.prototype.constructor === A
Pour tester l'héritage indirect, vous pouvez utiliser
B.prototype instanceof A
(cette deuxième solution a été donnée pour la première fois par Nirvana Tikku)
retour à 2017:
vérifier si cela fonctionne pour vous
A.isPrototypeOf(B)
Gotchas: Notez que instanceof
ne fonctionne pas comme prévu si vous utilisez plusieurs contextes/fenêtres d'exécution. Voir §§ .
De plus, pour https://johnresig.com/blog/objectgetprototypeof/ , il s'agit d'une implémentation alternative identique à instanceof
:
function f(_, C) { // instanceof Polyfill
while (_ != null) {
if (_ == C.prototype)
return true;
_ = _.__proto__;
}
return false;
}
Le modifier pour vérifier la classe directement nous donne:
function f(ChildClass, ParentClass) {
_ = ChildClass.prototype;
while (_ != null) {
if (_ == C.prototype)
return true;
_ = _.__proto__;
}
return false;
}
instanceof
vérifie lui-même si obj.proto
est f.prototype
, ainsi:
function A(){};
A.prototype = Array.prototype;
[]instanceof Array // true
et:
function A(){}
_ = new A();
// then change prototype:
A.prototype = [];
/*false:*/ _ instanceof A
// then change back:
A.prototype = _.__proto__
_ instanceof A //true
et:
function A(){}; function B(){};
B.prototype=Object.prototype;
/*true:*/ new A()instanceof B
Si ce n'est pas égal, proto est échangé avec proto de proto dans le test, puis proto de proto de proto, etc. Ainsi:
function A(){}; _ = new A()
_.__proto__.__proto__ = Array.prototype
g instanceof Array //true
et:
function A(){}
A.prototype.__proto__ = Array.prototype
g instanceof Array //true
et:
f=()=>{};
f.prototype=Element.prototype
document.documentElement instanceof f //true
document.documentElement.__proto__.__proto__=[];
document.documentElement instanceof f //false
Je ne pense pas que Simon ait voulu dire B.prototype = new A()
dans sa question, car ce n’est certainement pas le moyen de chaîner des prototypes en JavaScript.
En supposant que B prolonge A, utilisez Object.prototype.isPrototypeOf.call(A.prototype, B.prototype)