Наприклад:
function A(){}
function B(){}
B.prototype = new A();
Як я можу перевірити, чи клас B успадковує клас A?
Відповіді:
Спробуйте наступне:
ChildClass.prototype instanceof ParentClass
A.prototype
... developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…
Ви можете перевірити пряме успадкування за допомогою
B.prototype.constructor === A
Для перевірки непрямого успадкування ви можете використовувати:
B.prototype instanceof A
(це друге рішення вперше дала Нірвана Тікку)
назад до 2017 року:
перевірте, чи це працює для вас
ParentClass.isPrototypeOf(ChildClass)
Помилки: Зверніть увагу, що 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
Якщо воно не рівне, прото під час перевірки міняється місцями прото прото, потім прото прото прото тощо. Отже:
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
class
?class A extends B{}
тоді як я можу перевірити спадщину класуA