Ich bin wirklich verwirrt von den Antworten, die gegeben wurden - die meisten von ihnen sind einfach völlig falsch. Natürlich können Sie Objekteigenschaften haben, die undefinierte, null oder falsche Werte haben. Wenn Sie also einfach die Immobilienprüfung auf typeof this[property]
oder, noch schlimmer, reduzieren x.key
, erhalten Sie völlig irreführende Ergebnisse.
Es kommt darauf an, wonach Sie suchen. Wenn Sie wissen möchten, ob ein Objekt physisch eine Eigenschaft enthält (und nicht von irgendwo oben in der Prototypenkette stammt), dannobject.hasOwnProperty
ist dies der richtige Weg. Alle modernen Browser unterstützen dies. (Es fehlte in älteren Versionen von Safari - 2.0.1 und älter - aber diese Versionen des Browsers werden selten mehr verwendet.)
Wenn Sie suchen, ob ein Objekt eine Eigenschaft enthält, die iterierbar ist (wenn Sie über die Eigenschaften des Objekts iterieren, wird es angezeigt), gehen Sie wie folgt vor: prop in object
Sie erhalten den gewünschten Effekt.
Da die Verwendung hasOwnProperty
wahrscheinlich das ist, was Sie möchten, und wenn Sie bedenken, dass Sie möglicherweise eine Fallback-Methode wünschen, präsentiere ich Ihnen die folgende Lösung:
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 );
}
}
Das Obige ist eine funktionierende, browserübergreifende Lösung für hasOwnProperty
eine Einschränkung: Es kann nicht zwischen Fällen unterschieden werden, in denen sich eine identische Eigenschaft im Prototyp und in der Instanz befindet - es wird lediglich davon ausgegangen, dass sie vom Prototyp stammt. Sie könnten es je nach Ihrer Situation milder oder strenger gestalten, aber zumindest sollte dies hilfreicher sein.