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?

TERBANG
sumber
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.

James Allardice
sumber
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!

Om Sao
sumber
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
Pranay Rana
sumber
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]);
  }
}

Willem van der Veen
sumber
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.

kennebec
sumber
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
    }
}
Kunal Vashist
sumber
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').

Rahmat Ali
sumber
-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])
  }
}
LeeKlaus
sumber
-2

Ia memeriksa apakah suatu objek memiliki properti . Ini berfungsi sama if(obj.prop), sejauh yang saya tahu.

visualidiot
sumber
7
obj.propmengikuti rantai prototipe, hasOwnPropertytidak
Kristoffer Sall-Storgaard
12
Masalahnya adalah ketika propmemiliki nilai palsu. if(obj.hasOwnProperty('prop'))akan truesementara if(obj.prop)akan false.
Rodrigo Saling