Ví dụ:Làm thế nào để kiểm tra xem một lớp Javascript kế thừa một lớp khác (mà không tạo một obj)?
function A(){}
function B(){}
B.prototype = new A();
Làm thế nào tôi có thể kiểm tra xem lớp B kế thừa lớp A?
Ví dụ:Làm thế nào để kiểm tra xem một lớp Javascript kế thừa một lớp khác (mà không tạo một obj)?
function A(){}
function B(){}
B.prototype = new A();
Làm thế nào tôi có thể kiểm tra xem lớp B kế thừa lớp A?
Hãy cho đây là một thử B.prototype instanceof A
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)
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
Chỉ cần khôi phục nó. Cảm ơn dystroy (vì đã cập nhật câu trả lời này) –
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;
}
instanceof
tự kiểm tra nếu obj.proto
là f.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
Ngoài ra, hãy xem https://stackoverflow.com/a/29543030/632951 và https://stackoverflow.com/q/30993434/632951 – Pacerier
lại đến năm 2017:
kiểm tra nếu mà làm việc cho bạn
A.isPrototypeOf(B)
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
@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