I have a situation where I need to check if a constructor (X) has another constructor (Y) in its prototype chain (or is Y itself).
The quickest means to do this might be (new X()) instanceof Y
. That isn't an option in this case because the constructors in question may throw if instantiated without valid arguments.
The next approach I've considered is this:
const doesInherit = (A, B) => {
while (A) {
if (A === B) return true;
A = Object.getPrototypeOf(A);
}
return false;
}
That works, but I can't shake the sense that I'm missing some more straightforward way to check this. Is there one?
Because of the way instanceof
works, you should be able to do
A.prototype instanceof B
But this would only test inheritance, you should have to compare A === B
to test for self-reference:
A === B || A.prototype instanceof B
class A {}
class B extends A {}
class C extends B {}
console.log(C === C) // true
console.log(C.prototype instanceof B) // true
console.log(C.prototype instanceof A) // true
instanceof
is basically implemented as follows:
function instanceof(obj, Constr) {
var proto;
while ((proto = Object.getProtoypeOf(obj)) {
if (proto === Constr.prototype) {
return true;
}
}
return false;
}
It iterates over the prototype chain of the object and checks whether any of the prototypes equals the constructors prototype
property.
So almost like what you were doing, but internally.