Мене справді бентежить відповіді, які були отримані - більшість із них є просто невірними. Звичайно, ви можете мати властивості об’єктів, які мають невизначені, нульові або помилкові значення. Тож просто зведення перевірки власності до typeof this[property]
або, що ще гірше, x.key
дасть вам абсолютно оманливі результати.
Це залежить від того, що ви шукаєте. Якщо ви хочете знати, чи об'єкт фізично містить властивість (і він не надходить звідкись у ланцюзі прототипу), тоді object.hasOwnProperty
це шлях. Всі сучасні браузери його підтримують. (Він був відсутній у старих версіях Safari - 2.0.1 і пізніших версій, але ці версії браузера вже рідше використовуються.)
Якщо ви шукаєте, якщо об’єкт має на ньому властивість, яка є ітерабельною (коли ви повторюєте властивості об'єкта, він з’явиться), то виконання: prop in object
дасть вам бажаний ефект.
Оскільки використання hasOwnProperty
- це, мабуть, те, що ви хочете, і враховуючи, що ви можете скористатися резервним методом, я пропоную вам таке рішення:
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 );
}
}
Вищенаведене є робочим, крос-браузерним рішенням hasOwnProperty
, з одним застереженням: він не в змозі розрізнити випадки, коли однакова властивість є в прототипі, і по екземпляру - вона просто припускає, що вона походить від прототипу. Ви можете змінити її на більш м'яку чи сувору залежність від вашої ситуації, але принаймні це має бути корисніше.