Tôi thực sự bối rối trước những câu trả lời đã được đưa ra - hầu hết chúng đều hoàn toàn không chính xác. Tất nhiên bạn có thể có các thuộc tính đối tượng có giá trị không xác định, null hoặc sai. Vì vậy, chỉ cần giảm kiểm tra tài sản xuống typeof this[property]
hoặc thậm chí tệ hơn, x.key
sẽ cung cấp cho bạn kết quả hoàn toàn sai lệch.
Nó phụ thuộc vào những gì bạn đang tìm kiếm. Nếu bạn muốn biết liệu một vật thể có chứa một thuộc tính (và nó không đến từ đâu đó trên chuỗi nguyên mẫu) thì đó object.hasOwnProperty
là cách để đi. Tất cả các trình duyệt hiện đại đều hỗ trợ nó. (Nó bị thiếu trong các phiên bản Safari cũ hơn - 2.0.1 trở lên - nhưng những phiên bản trình duyệt đó hiếm khi được sử dụng nữa.)
Nếu những gì bạn đang tìm kiếm là nếu một đối tượng có thuộc tính trên đó có thể lặp lại (khi bạn lặp lại các thuộc tính của đối tượng, nó sẽ xuất hiện) thì sẽ thực hiện: prop in object
sẽ cho bạn hiệu ứng mong muốn.
Vì sử dụng hasOwnProperty
có thể là những gì bạn muốn và xem xét rằng bạn có thể muốn một phương pháp dự phòng, tôi trình bày cho bạn giải pháp sau:
var obj = {
a: undefined,
b: null,
c: false
};
// a, b, c all found
for ( var prop in obj ) {
document.writeln( "Object1: " + prop );
}
function Class(){
this.a = undefined;
this.b = null;
this.c = false;
}
Class.prototype = {
a: undefined,
b: true,
c: true,
d: true,
e: true
};
var obj2 = new Class();
// a, b, c, d, e found
for ( var prop in obj2 ) {
document.writeln( "Object2: " + prop );
}
function hasOwnProperty(obj, prop) {
var proto = obj.__proto__ || obj.constructor.prototype;
return (prop in obj) &&
(!(prop in proto) || proto[prop] !== obj[prop]);
}
if ( Object.prototype.hasOwnProperty ) {
var hasOwnProperty = function(obj, prop) {
return obj.hasOwnProperty(prop);
}
}
// a, b, c found in modern browsers
// b, c found in Safari 2.0.1 and older
for ( var prop in obj2 ) {
if ( hasOwnProperty(obj2, prop) ) {
document.writeln( "Object2 w/ hasOwn: " + prop );
}
}
Trên đây là một giải pháp hoạt động, đa trình duyệt, hasOwnProperty
với một cảnh báo: Không thể phân biệt giữa các trường hợp có một thuộc tính giống hệt nhau trên nguyên mẫu và ví dụ - nó chỉ giả định rằng nó đến từ nguyên mẫu. Bạn có thể thay đổi nó để trở nên khoan dung hơn hoặc nghiêm khắc hơn, dựa trên tình huống của bạn, nhưng ít nhất điều này sẽ hữu ích hơn.