JavaScript'te hasOwnProperty'de özellik nedir?


97

Düşünmek:

if (someVar.hasOwnProperty('someProperty') ) {
 // Do something();
} else {
 // Do somethingElse();
}

Doğru kullanım / açıklama hasOwnProperty('someProperty')nedir?

Neden someVar.somePropertybir nesnenin someVarisimli özellik içerip içermediğini kontrol etmek için kullanamıyoruz someProperty?

Bu durumda özellik nedir?

Bu JavaScript hangi özelliği kontrol ediyor?



Bu soruyu sorduğumda, bazı html'leri kontrol eden bir işlev olduğunu düşündüm. Şimdi bir javascript nesnesini veya o nesne veya yöntem içindeki bir 'değişken' için yöntemi kontrol ettiğini görüyorum. teşekkürler!
FLY

Yanıtlar:


165

hasOwnPropertyÇağırdığınız nesnenin bağımsız değişken adına sahip bir özelliğe sahip olup olmadığını gösteren bir boole değeri döndürür. Örneğin:

var x = {
    y: 10
};
console.log(x.hasOwnProperty("y")); //true
console.log(x.hasOwnProperty("z")); //false

Ancak, nesnenin prototip zincirine bakmaz.

for...inYapı ile bir nesnenin özelliklerini numaralandırırken kullanmak faydalıdır .

Tüm detayları görmek istiyorsanız, ES5 spesifikasyonu her zamanki gibi bakmak için iyi bir yerdir.


6
Prototip zinciri için bonus puanlar. Hala bir nesneye çağrılmadığında neyi çağırdığını anlamaya çalışıyorum ... değilwindow
Kristoffer Sall-Storgaard

@KristofferSHansen - Bunu da merak ediyordum ama soru düzenlendi, bu yüzden şimdi bir nesneye çağrılıyor. Değilse, bir hata atılır.
James Allardice

Sanırım bu işleri değiştiriyor. Yine de Chrome'da konsoldan çalıştırıldığında hata yok.
Kristoffer Sall-Storgaard

@KristofferSHansen - Bunun, konsolun kodu çalıştırma biçiminden kaynaklandığını düşünüyorum ( evalglobal veya işlev kodu yerine kod olarak çalışıyor). Bunu boş bir HTML sayfasında denedim ve "null nesneye dönüştürülemiyor" hatası alıyorum.
James Allardice

@KristofferSHansen, bir sınıf yönteminde çağrıldığında Kunal Vashist yanıtını görüyor
FLY

25

İşte kısa ve kesin bir cevap:

JavaScript'te, her nesnenin, nesne hakkında meta bilgileri olan bir dizi yerleşik anahtar / değer çifti vardır. Bir for...innesne için construct / loop'u kullanarak tüm anahtar-değer çiftleri arasında döngü oluşturduğunuzda, bu meta-bilgi anahtar-değer çiftlerinde de döngü yapıyorsunuz (ki kesinlikle istemezsiniz).

Buraya resim açıklamasını girin

Kullanılması hasOwnPropery(property) filtreleri aşımı meta bilgileri ve parametredir doğrudan kontrolleri aracılığıyla bu gereksiz döngü propertynesne ya da olmasın bir kullanıcı tarafından verilen bir özelliktir. By filtreler aşımı , bunu, demek hasOwnProperty(property), eğer görünmüyor propertyaka Nesnenin prototip zincirinde meta bilgileri bulunmaktadır.

Buna true/falsegöre boole döndürür .

İşte bir örnek:

var fruitObject = {"name": "Apple", "shape": "round", "taste": "sweet"};
console.log(fruitObject.hasOwnProperty("name"));  //true
console.log(Object.prototype.hasOwnProperty("toString");) //true because in above snapshot you can see, that there is a function toString in meta-information

Umarım açıktır!


örneğinizin son satırına yazdığınız console.log(Object.prototype....; bunu mu demek istediniz console.log(fruitObject.? FruitObject veya Object?
Hamid Araghi

> "bu meta-bilgi anahtar-değer çiftleri arasında da döngü yapıyorsunuz" Ancak for (var key in fruitObject) { ... }yine de js döngülerini prototip olmayan anahtarlar üzerinden çalıştırdığımda , bir şeyi kaçırmış mıyım veya JS çalışma zamanı nesnede anahtar için işleme biçimini değiştirmiş mi? döngüler?
ChickenFeet

13

Şunları kontrol eder:

Bir nesnenin belirtilen ada sahip bir özelliğe sahip olup olmadığını gösteren bir Boolean değeri döndürür

HasOwnProperty nesne öyle değil yanlış ise belirtilen adla bir özelliğini, varsa metot bize doğru. Bu yöntem, özelliğin nesnenin prototip zincirinde olup olmadığını kontrol etmez; özellik, nesnenin kendisinin bir üyesi olmalıdır.

Misal:

var s = new String("Sample");
document.write(s.hasOwnProperty("split"));                        //false
document.write(String.prototype.hasOwnProperty("split"));         //true

2
-1 verdim çünkü ilk cevabınız kısa ve tamamen tutarsız bir cümleydi, bu daha sonra biraz daha uzun, biraz daha tutarlı, ancak tamamen yanlış bir cümleye güncellendi.

@ amnotiam- ama şimdi çok net olduğunu düşünüyorum ... çünkü internet sorunum daha fazla
yayınlayamadığım için

12

Özet:

hasOwnProperty()herhangi bir nesnede çağrılabilen ve girdi olarak bir dizge alan bir işlevdir. trueÖzellik nesne üzerinde bulunuyorsa bir boole döndürür , aksi takdirde false döndürür. hasOwnProperty()üzerinde bulunur Object.prototypeve dolayısıyla herhangi bir nesne için kullanılabilir.

Misal:

function Person(name) {
  this.name = name;
}

Person.prototype.age = 25;

const willem = new Person('willem');

console.log(willem.name); // Property found on object
console.log(willem.age); // Property found on prototype

console.log(willem.hasOwnProperty('name')); // 'name' is on the object itself
console.log(willem.hasOwnProperty('age')); // 'age' is not on the object itself

Bu örnekte yeni bir Person nesnesi yaratılmıştır. Her Kişinin kurucuda başlatılan kendi adı vardır. Ancak yaş, nesnede değil, nesnenin prototipinde bulunur. Bu nedenle isim ve yaş için hasOwnProperty()geri döner .truefalse

Pratik uygulamalar:

hasOwnProperty()döngü kullanarak bir nesnenin üzerinde döngü oluştururken çok yararlı olabilir for in. Özelliklerin prototipten değil nesnenin kendisinden olup olmadığını kontrol edebilirsiniz. Örneğin:

function Person(name, city) {
  this.name = name;
  this.city = city;
}

Person.prototype.age = 25;

const willem = new Person('Willem', 'Groningen');

for (let trait in willem) {
  console.log(trait, willem[trait]); // This loops through all properties, including the prototype
}

console.log('\n');

for (let trait in willem) {
  if (willem.hasOwnProperty(trait)) { // This loops only through 'own' properties of the object
    console.log(trait, willem[trait]);
  }
}


3

Bir nesnenin numaralandırılabilir bir özelliğe sahip olup olmadığını belirlemek için object.hasOwnProperty ( p ) kullanırsınız p -

Bir nesnenin, nesnenin her örneğine 'varsayılan' yöntem ve niteliklerin atandığı kendi prototipi olabilir. hasOwnProperty, yalnızca yapıcıda özel olarak ayarlanmış veya örneğe daha sonra eklenen özellikler için true değerini döndürür.

P'nin nesne için herhangi bir yerde tanımlanıp tanımlanmadığını belirlemek için, if ( p instanceof nesnesi) kullanın; burada p, bir özellik adı dizesi olarak değerlendirilir.

Örneğin, varsayılan olarak tüm nesnelerin bir 'toString' yöntemi vardır, ancak hasOwnProperty'de görünmeyecektir.


2

hasOwnProperty, dize bağımsız değişkeni alan normal bir JavaScript işlevidir.

Sizin durumunuzda, işlevin olup somevar.hasOwnProperty('someProperty')olmadığını kontrol eder - true ve false döndürür.somevarsomepropery

Söyle

function somevar() {
    this.someProperty = "Generic";
}

function welcomeMessage()
{
    var somevar1 = new somevar();
    if(somevar1.hasOwnProperty("name"))
    {
        alert(somevar1.hasOwnProperty("name")); // It will return true
    }
}

2

hasOwnPropertybir nesnenin bir özelliğe sahip olup olmadığını kontrol etmenin uygun bir yoludur . someVar.somePropertybu duruma alternatif olarak kullanılamaz. Aşağıdaki durum iyi bir fark gösterecektir:

const someVar = { isFirst: false };


// The condition is true, because 'someVar' has property 'isFirst'
if (someVar.hasOwnProperty('isFirst')) {
  // Code runs
}


// The condition is false, because 'isFirst' is false.
if (someVar.isFirst) {
  // Code does not runs here
}

Bu nedenle someVar.isFirstalternatif olarak kullanılamaz someVar.hasOwnProperty('isFirst').


-1

Sahne A:

const objA = { a: 1, b: 2 }
for (const key in objA) {
  if (objA.hasOwnProperty(key)) {
    console.log(objA[key])
  }
}

    Output

    1
    2

Sahne B:

const objB = {
  a: 1,
  b: 2,
  hasOwnProperty() {
    return false
  }
}

for (const key in objB) {
  if (objB.hasOwnProperty(key)) {
    console.log(objB[key])
  }
}

    Outputs nothing

Çünkü JavaScript hasOwnProperty özelliğini korumaz. Yani bunu şu şekilde kullanabilirsiniz:

for (const key in objB) {
  if (Object.prototype.hasOwnProperty.call(obj, key)) {
    console.log(objB[key])
  }
}

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.