2013-01-23 74 views

回答

75

給予這試一試B.prototype instanceof A

+2

** ES6 **'class'呢? 'A類擴展B {}'那麼我怎樣才能檢查類'A'的繼承性呢? – Omid

+0

@Omid ** ES6類的語法**大部分就是這樣:一些特殊的_syntax_。在幕後,「類」的實際處理並沒有改變,因此你仍然可以使用'A.prototype' ... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference /類 – cepharum

17

您可以測試直接繼承與

B.prototype.constructor === A 

爲了測試間接繼承,你可以使用

B.prototype instanceof A 

(第二方案最初是由涅槃Tikku給出)

+5

沒有這項工作,將只檢查父類,不是所有的herita ge鏈。 – Simon

+0

剛剛恢復它。感謝dystroy(更新這個答案) –

1

陷阱:請注意,如果您使用多個執行上下文/窗口,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.protof.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 
+0

另請參閱https://stackoverflow.com/a/29543030/632951和https://stackoverflow.com/q/30993434/632951 – Pacerier

4

回到2017年:
檢查,如果你

​​
相關問題