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