Saya benar-benar bingung dengan jawaban yang telah diberikan - kebanyakan dari mereka benar-benar salah. Tentu saja Anda dapat memiliki properti objek yang memiliki nilai undefined, null, atau false. Jadi hanya dengan mengurangi pemeriksaan properti ke typeof this[property]
atau, lebih buruk lagi, x.key
akan memberi Anda hasil yang sepenuhnya menyesatkan.
Tergantung pada apa yang Anda cari. Jika Anda ingin tahu apakah suatu objek secara fisik mengandung properti (dan itu tidak datang dari suatu tempat di atas rantai prototipe) maka object.hasOwnProperty
adalah cara untuk pergi. Semua browser modern mendukungnya. (Versi ini hilang di versi Safari yang lebih lama - 2.0.1 dan lebih lama - tetapi versi browser tersebut jarang digunakan lagi.)
Jika yang Anda cari adalah jika sebuah objek memiliki properti di atasnya yang dapat diubah (ketika Anda beralih pada properti objek, itu akan muncul) kemudian melakukan: prop in object
akan memberikan efek yang Anda inginkan.
Karena menggunakan hasOwnProperty
mungkin apa yang Anda inginkan, dan mempertimbangkan bahwa Anda mungkin menginginkan metode mundur, saya berikan kepada Anda solusi berikut:
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 );
}
}
Di atas adalah solusi lintas-browser yang berfungsi, hasOwnProperty
dengan satu peringatan: Tidak dapat membedakan antara kasus di mana properti yang identik berada pada prototipe dan pada contoh - hanya mengasumsikan bahwa itu berasal dari prototipe. Anda bisa mengubahnya menjadi lebih lunak atau ketat, berdasarkan situasi Anda, tetapi setidaknya ini seharusnya lebih bermanfaat.