2013-01-23 30 views

Trả lời

75

Hãy cho đây là một thử B.prototype instanceof A

+2

Còn về ** ES6 ** 'class' thì sao? 'class A mở rộng B {}' thì làm thế nào tôi có thể kiểm tra thừa kế của lớp 'A' – Omid

+0

@Omid ** Cú pháp lớp ES6 ** chủ yếu là: một số _syntax_ đặc biệt.Đằng sau hậu trường việc xử lý thực tế của "lớp học" đã không thay đổi và do đó bạn vẫn có thể làm việc với 'A.prototype' ... https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Các lớp học – cepharum

17

Bạn có thể kiểm tra thừa kế trực tiếp với

B.prototype.constructor === A 

Để kiểm tra thừa kế gián tiếp, bạn có thể sử dụng

B.prototype instanceof A 

(giải pháp thứ hai này lần đầu tiên được đưa ra bởi Nirvana Tikku)

+5

Không mà sẽ chỉ kiểm tra lớp cha mẹ, không phải tất cả herita chuỗi địa lý. – Simon

+0

Chỉ cần khôi phục nó. Cảm ơn dystroy (vì đã cập nhật câu trả lời này) –

1

Gotchas: Lưu ý rằng instanceof không hoạt động như mong đợi nếu bạn sử dụng nhiều bối cảnh/cửa sổ thực thi. Xem §§.


Ngoài ra, mỗi https://johnresig.com/blog/objectgetprototypeof/, đây là một thực hiện thay thế giống hệt instanceof:

function f(_, C) { // instanceof Polyfill 
    while (_ != null) { 
    if (_ == C.prototype) 
     return true; 
    _ = _.__proto__; 
    } 
    return false; 
} 

Sửa đổi nó để kiểm tra các lớp trực tiếp cho chúng ta:

function f(ChildClass, ParentClass) { 
    _ = ChildClass.prototype; 
    while (_ != null) { 
    if (_ == C.prototype) 
     return true; 
    _ = _.__proto__; 
    } 
    return false; 
} 


Sidenote

instanceof tự kiểm tra nếu obj.protof.prototype, như sau:

function A(){}; 
A.prototype = Array.prototype; 
[]instanceof Array // true 

và:

function A(){} 
_ = new A(); 
// then change prototype: 
A.prototype = []; 
/*false:*/ _ instanceof A 
// then change back: 
A.prototype = _.__proto__ 
_ instanceof A //true 

và:

function A(){}; function B(){}; 
B.prototype=Object.prototype; 
/*true:*/ new A()instanceof B 

Nếu đó là không bình đẳng, proto được hoán đổi với proto của proto trong kiểm tra, sau đó proto của proto của proto, và như vậy. Như vậy:

function A(){}; _ = new A() 
_.__proto__.__proto__ = Array.prototype 
g instanceof Array //true 

và:

function A(){} 
A.prototype.__proto__ = Array.prototype 
g instanceof Array //true 

và:

f=()=>{}; 
f.prototype=Element.prototype 
document.documentElement instanceof f //true 
document.documentElement.__proto__.__proto__=[]; 
document.documentElement instanceof f //false 
+0

Ngoài ra, hãy xem https://stackoverflow.com/a/29543030/632951 và https://stackoverflow.com/q/30993434/632951 – Pacerier

4

lại đến năm 2017:
kiểm tra nếu mà làm việc cho bạn

A.isPrototypeOf(B) 
Các vấn đề liên quan