Nếu tôi hiểu đúng, mỗi và mọi đối tượng trong Javascript đều kế thừa từ nguyên mẫu Đối tượng
Nó có vẻ giống như những sợi tóc chẻ đôi, nhưng có sự khác biệt giữa javascript (thuật ngữ chung cho các triển khai ECMAScript) và ECMAScript (ngôn ngữ được sử dụng để triển khai javascript). Đó là ECMAScript định nghĩa một lược đồ kế thừa, không phải javascript, vì vậy chỉ các đối tượng ECMAScript gốc mới cần triển khai lược đồ kế thừa đó.
Một chương trình javascript đang chạy bao gồm ít nhất các đối tượng ECMAScript được tích hợp sẵn (Đối tượng, Hàm, Số, v.v.) và có thể là một số đối tượng gốc (ví dụ: các hàm). Nó cũng có thể có một số đối tượng máy chủ lưu trữ (chẳng hạn như đối tượng DOM trong trình duyệt hoặc các đối tượng khác trong môi trường máy chủ lưu trữ khác).
Trong khi các đối tượng tích hợp sẵn và các đối tượng gốc phải triển khai sơ đồ kế thừa được định nghĩa trong ECMA-262, các đối tượng máy chủ lưu trữ thì không. Do đó, không phải tất cả các đối tượng trong môi trường javascript đều phải kế thừa từ Object.prototype . Ví dụ, các đối tượng máy chủ lưu trữ trong IE được triển khai dưới dạng đối tượng ActiveX sẽ phát sinh lỗi nếu được coi là đối tượng gốc (do đó tại sao try..catch được sử dụng để khởi tạo đối tượng MS XMLHttpRequest). Một số đối tượng DOM (như NodeLists trong IE ở chế độ quirks) nếu được chuyển đến các phương thức Array sẽ gây ra lỗi, các đối tượng DOM trong IE 8 trở xuống không có lược đồ kế thừa giống như ECMAScript, v.v.
Do đó, không nên cho rằng tất cả các đối tượng trong môi trường javascript đều kế thừa từ Object.prototype.
có nghĩa là mỗi đối tượng trong Javascript đều có quyền truy cập vào hàm hasOwnProperty thông qua chuỗi nguyên mẫu của nó
Điều này không đúng với một số đối tượng máy chủ nhất định trong IE ở chế độ quirks (và IE 8 trở xuống luôn luôn).
Với những điều trên, thật đáng cân nhắc tại sao một đối tượng có thể có phương thức hasOwnProperty của riêng nó và khả năng tư vấn của việc gọi một số phương thức hasOwnProperty khác mà không cần thử nghiệm trước xem đó có phải là một ý tưởng tốt hay không.
Biên tập
Tôi nghi ngờ rằng lý do sử dụng Object.prototype.hasOwnProperty.call
là trong một số trình duyệt, các đối tượng máy chủ lưu trữ không có phương thức hasOwnProperty , sử dụng lệnh gọi và phương thức tích hợp là một phương thức thay thế. Tuy nhiên, làm như vậy chung chung không phải là một ý tưởng hay vì những lý do đã nêu ở trên.
Khi có liên quan đến các đối tượng chủ, toán tử in có thể được sử dụng để kiểm tra các thuộc tính nói chung, ví dụ
var o = document.getElementsByTagName('foo');
// false in most browsers, throws an error in IE 6, and probably 7 and 8
o.hasOwnProperty('bar');
// false in all browsers
('bar' in o);
// false (in all browsers? Do some throw errors?)
Object.prototype.hasOwnProperty.call(o, 'bar');
Một giải pháp thay thế (được thử nghiệm trong IE6 và các phiên bản khác):
function ownProp(o, prop) {
if ('hasOwnProperty' in o) {
return o.hasOwnProperty(prop);
} else {
return Object.prototype.hasOwnProperty.call(o, prop);
}
}
Bằng cách đó, bạn chỉ gọi cụ thể hasOwnProperty tích hợp trong đó đối tượng không có nó (kế thừa hoặc cách khác).
Tuy nhiên, nếu một đối tượng không có hasOwnProperty
phương thức, nó có thể phù hợp để sử dụng toán tử in vì đối tượng có thể không có lược đồ kế thừa và tất cả các thuộc tính đều nằm trên đối tượng (đó chỉ là giả định), ví dụ: trong toán tử là một cách phổ biến (và dường như thành công) để kiểm tra hỗ trợ đối tượng DOM cho các thuộc tính.