Я действительно смущен ответами, которые были даны - большинство из них просто неверны. Конечно, у вас могут быть свойства объекта с неопределенными, нулевыми или ложными значениями. Так что простое уменьшение проверки свойства до 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
с одним предупреждением: невозможно различить случаи, когда идентичное свойство находится в прототипе, и в экземпляре - оно просто предполагает, что оно исходит от Прототип. Вы можете изменить его на более снисходительный или строгий, исходя из вашей ситуации, но, по крайней мере, это должно быть более полезным.