Verilen cevaplarla gerçekten kafam karıştı - çoğu sadece yanlış. Elbette tanımlanmamış, boş veya yanlış değerlere sahip nesne özelliklerine sahip olabilirsiniz. Bu nedenle, özellik kontrolünü basitleştirmek typeof this[property]
veya daha da kötüsü, x.key
tamamen yanıltıcı sonuçlar verecektir.
Aradığın şeye bağlı. Bir nesnenin fiziksel olarak bir özellik içerip içermediğini bilmek istiyorsanız (ve prototip zincirinde bir yerden gelmiyorsa) o zaman object.hasOwnProperty
gitmek için yoldur. Tüm modern tarayıcılar bunu destekler. (Safari'nin eski sürümlerinde - 2.0.1 ve daha eski - eksikti, ancak tarayıcının bu sürümleri artık nadiren kullanılıyor.)
Eğer aradığınız şey, bir nesnenin üzerinde yinelenebilir bir özelliğe sahipse (nesnenin özellikleri üzerinde yinelediğinizde görünecektir) o zaman yapmak: prop in object
size istediğiniz efekti verecektir.
Kullanmak hasOwnProperty
muhtemelen istediğiniz gibi olduğundan ve bir geri dönüş yöntemi isteyebileceğinizden dolayı, size aşağıdaki çözümü sunuyoruz:
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 );
}
}
Yukarıdaki, hasOwnProperty
tek bir uyarı ile çalışan, çapraz tarayıcılı bir çözümdür : Prototipte ve örnekte aynı özelliğin olduğu durumlar arasında ayrım yapamaz - sadece prototipten geldiğini varsayar. Durumunuza bağlı olarak daha yumuşak veya katı olacak şekilde değiştirebilirsiniz, ancak en azından bu daha yararlı olacaktır.