如:如何檢查一個Javascript類是否繼承另一個(不創建obj)?
function A(){}
function B(){}
B.prototype = new A();
如何檢查,如果B類繼承A類?
如:如何檢查一個Javascript類是否繼承另一個(不創建obj)?
function A(){}
function B(){}
B.prototype = new A();
如何檢查,如果B類繼承A類?
給予這試一試B.prototype instanceof A
您可以測試直接繼承與
B.prototype.constructor === A
爲了測試間接繼承,你可以使用
B.prototype instanceof A
(第二方案最初是由涅槃Tikku給出)
沒有這項工作,將只檢查父類,不是所有的herita ge鏈。 – Simon
剛剛恢復它。感謝dystroy(更新這個答案) –
陷阱:請注意,如果您使用多個執行上下文/窗口,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
另請參閱https://stackoverflow.com/a/29543030/632951和https://stackoverflow.com/q/30993434/632951 – Pacerier
回到2017年:
檢查,如果你
** ES6 **'class'呢? 'A類擴展B {}'那麼我怎樣才能檢查類'A'的繼承性呢? – Omid
@Omid ** ES6類的語法**大部分就是這樣:一些特殊的_syntax_。在幕後,「類」的實際處理並沒有改變,因此你仍然可以使用'A.prototype' ... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /類 – cepharum