Je suis vraiment confus par les réponses qui ont été données - la plupart d'entre elles sont tout simplement incorrectes. Bien sûr, vous pouvez avoir des propriétés d'objet qui ont des valeurs non définies, nulles ou fausses. Donc, simplement réduire le chèque de propriété à typeof this[property]
ou, pire encore,x.key
vous donnera des résultats complètement trompeurs.
Cela dépend de ce que vous recherchez. Si vous voulez savoir si un objet contient physiquement une propriété (et qu'il ne vient pas de quelque part sur la chaîne du prototype), alorsobject.hasOwnProperty
c'est la voie à suivre. Tous les navigateurs modernes le prennent en charge. (Il manquait dans les anciennes versions de Safari - 2.0.1 et antérieures - mais ces versions du navigateur ne sont plus rarement utilisées.)
Si ce que vous recherchez, c'est si un objet a une propriété itérative (lorsque vous parcourez les propriétés de l'objet, il apparaîtra), puis faites: prop in object
vous donnera l'effet souhaité.
Étant donné que l'utilisation hasOwnProperty
est probablement ce que vous voulez, et considérant que vous pouvez souhaiter une méthode de secours, je vous présente la solution suivante:
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 );
}
}
Ce qui précède est une solution multi-navigateur qui fonctionne hasOwnProperty
, avec une mise en garde: il ne peut pas distinguer les cas où une propriété identique se trouve sur le prototype et sur l'instance - il suppose simplement qu'elle provient du prototype. Vous pouvez la modifier pour qu'elle soit plus clémente ou stricte, en fonction de votre situation, mais au moins cela devrait être plus utile.