Apakah properti di hasOwnProperty dalam JavaScript?


97

Mempertimbangkan:

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

Penggunaan / penjelasan apa yang benar hasOwnProperty('someProperty')?

Mengapa kita tidak bisa begitu saja menggunakan someVar.somePropertyuntuk memeriksa apakah suatu objek someVarberisi properti dengan nama someProperty?

Apa properti dalam kasus ini?

Properti apa yang diperiksa JavaScript ini?



Ketika saya menanyakan pertanyaan ini, saya pikir itu adalah fungsi yang memeriksa beberapa html. Sekarang saya melihatnya memeriksa objek atau metode javascript untuk 'variabel' di dalam objek atau metode itu. terima kasih!
TERBANG

Jawaban:


165

hasOwnPropertymengembalikan nilai boolean yang menunjukkan apakah objek yang Anda panggil memiliki properti dengan nama argumen. Sebagai contoh:

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

Namun, itu tidak melihat rantai prototipe objek.

Ini berguna untuk menggunakannya saat Anda menghitung properti objek dengan for...inkonstruksi.

Jika Anda ingin melihat detail selengkapnya, spesifikasi ES5 , seperti biasa, adalah tempat yang bagus untuk melihat.


6
Poin bonus untuk rantai prototipe. Masih mencoba untuk mencari tahu apa panggilannya ketika tidak dipanggil pada suatu objek ... bukanwindow
Kristoffer Sall-Storgaard

@KristofferSHansen - Saya juga bertanya-tanya, tetapi pertanyaannya telah diedit sehingga sekarang dipanggil pada sebuah objek. Jika tidak, kesalahan terjadi.
James Allardice

Saya kira itu mengubah banyak hal. Tidak ada kesalahan saat dijalankan dari konsol di Chrome.
Kristoffer Sall-Storgaard

@KristofferSHansen - Saya pikir itu karena cara konsol menjalankan kode (dijalankan sebagai evalkode daripada kode global atau fungsi). Saya mencobanya di halaman HTML kosong dan mendapatkan error "tidak dapat mengubah null menjadi objek".
James Allardice

@KristofferSen melihat jawaban Kunal Vashist ketika dipanggil pada metode kelas
FLY

25

Berikut adalah jawaban singkat dan tepat:

Di JavaScript, setiap objek memiliki sekumpulan key-value pair bawaan yang memiliki informasi meta tentang objek tersebut. Saat Anda mengulang semua pasangan nilai kunci menggunakan for...inkonstruksi / putaran untuk objek, Anda juga mengulang melalui pasangan nilai kunci meta-informasi ini (yang pasti tidak Anda inginkan).

Masukkan deskripsi gambar di sini

Menggunakan hasOwnPropery(property) filter-out perulangan yang tidak perlu ini melalui informasi meta dan secara langsung memeriksa apakah parameter propertyadalah properti yang diberikan pengguna di objek atau tidak. Dengan filter-out , maksud saya, itu hasOwnProperty(property)tidak terlihat jika, propertyada di rantai prototipe Object alias informasi meta.

Ia mengembalikan boolean true/falseberdasarkan itu.

Berikut ini contohnya:

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

Saya harap ini jelas!


di baris terakhir dari contoh Anda yang Anda tulis console.log(Object.prototype....; yang Anda maksud console.log(fruitObject.? fruitObject atau Object?
Hamid Araghi

> "Anda juga mengulang pasangan nilai-kunci meta-informasi ini" Tapi ketika saya menjalankan for (var key in fruitObject) { ... }js hanya siklus melalui kunci non-prototipe, apakah saya melewatkan sesuatu atau apakah runtime JS mengubah cara mereka menangani kunci-dalam-objek loop?
ChickenFeet

13

Ia memeriksa:

Mengembalikan nilai Boolean yang menunjukkan apakah suatu objek memiliki properti dengan nama yang ditentukan

The hasOwnProperty kembali metode yang benar jika objek memiliki properti nama tertentu, false jika tidak. Metode ini tidak memeriksa apakah properti ada di rantai prototipe objek; properti harus menjadi anggota dari objek itu sendiri.

Contoh:

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

2
Saya memberikan -1 karena jawaban awal Anda adalah kalimat pendek dan sama sekali tidak koheren, yang kemudian diperbarui menjadi kalimat yang sedikit lebih panjang, sedikit lebih koheren, tetapi sama sekali tidak akurat.

@ amnotiam- tapi saya pikir sekarang sudah lebih jelas ... karena masalah internet saya, saya tidak dapat memposting lebih banyak ..........
Pranay Rana

12

Ringkasan:

hasOwnProperty()adalah fungsi yang dapat dipanggil pada objek apa pun dan menggunakan string sebagai input. Ini mengembalikan boolean yang truejika properti terletak pada objek, jika tidak, mengembalikan salah. hasOwnProperty()terletak di Object.prototypedan dengan demikian tersedia untuk objek apa pun.

Contoh:

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

Dalam contoh ini, objek Person baru dibuat. Setiap Orang memiliki namanya sendiri yang diinisialisasi di konstruktor. Akan tetapi, umur tidak terletak pada objek tetapi pada prototipe objek tersebut. Oleh karena hasOwnProperty()itu, kembali trueuntuk nama dan falseusia.

Aplikasi praktis:

hasOwnProperty()bisa sangat berguna saat mengulang objek menggunakan for inloop. Anda dapat memeriksanya jika properti berasal dari objek itu sendiri dan bukan prototipe. Sebagai contoh:

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

Anda menggunakan object.hasOwnProperty ( p ) untuk menentukan apakah sebuah objek memiliki properti enumerable p -

Sebuah objek dapat memiliki prototipe sendiri, di mana metode dan atribut 'default' ditetapkan ke setiap instance objek. hasOwnProperty mengembalikan nilai true hanya untuk properti yang secara khusus ditetapkan dalam konstruktor, atau ditambahkan ke instance nanti.

Untuk menentukan apakah p didefinisikan sama sekali, di mana saja, untuk objek tersebut, gunakan if ( p instanceof object), di mana p mengevaluasi ke string nama-properti.

Misalnya, secara default semua objek memiliki metode 'toString', tetapi tidak akan muncul di hasOwnProperty.


2

hasOwnProperty adalah fungsi JavaScript normal yang menggunakan argumen string.

Dalam kasus Anda somevar.hasOwnProperty('someProperty'), itu memeriksa somevarfungsi memiliki someproperyatau tidak - itu mengembalikan benar dan salah.

Mengatakan

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

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

2

hasOwnPropertyadalah cara yang tepat untuk memeriksa suatu benda memiliki properti atau tidak. someVar.somePropertytidak dapat digunakan sebagai alternatif untuk situasi ini. Kondisi berikut akan menunjukkan perbedaan yang baik:

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
}

Karenanya someVar.isFirsttidak dapat digunakan alternatif someVar.hasOwnProperty('isFirst').


-1

Adegan A:

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

    Output

    1
    2

Adegan 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

Karena JavaScript tidak melindungi properti hasOwnProperty. Jadi Anda bisa menggunakannya seperti ini:

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

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.