Dalam Javascript, forin tidak mengulangi properti prototipe?

Di MDN (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty), saya melihat cuplikan seperti ini:

var buz = {
  fog: 'stack'
};

for (var name in buz) {
  if (buz.hasOwnProperty(name)) {
    console.log('this is fog (' + name + ') for sure. Value: ' + buz[name]);
  }
  else {
    console.log(name); // toString or something else
  }
}

Dalam cuplikannya, console.log(name); // toString or something else terlihat agak membingungkan saya. Saya memahami toString adalah properti Object.prototype dan properti ini dapat diakses oleh buz.toString.

Namun, ketika saya menjalankan cuplikan di Chrome, saya tidak melihat properti toString dicetak (console.log), meskipun komentar mengatakan itu harus diulang oleh for..in dan dicetak..

Adakah yang tahu mengapa properti dari prototipe seseorang tidak dapat diulangi dengan "for..in"?


person Hanfei Sun    schedule 11.11.2015    source sumber
comment
Object.prototype.toString adalah properti yang tidak dapat dihitung.   -  person Bergi    schedule 11.11.2015


Jawaban (2)


for x in obj hanya mengulangi properti objek yang dapat dihitung (termasuk yang ada pada prototipe). Properti tertentu dapat ditandai sebagai dapat dihitung atau tidak. Jadi, jika for/in melewatkan beberapa properti, kemungkinan besar itu karena properti tersebut tidak dikonfigurasi sebagai enumerable.

Lihat demo yang berfungsi di sini: http://jsfiddle.net/jfriend00/gyc9gnmj/ yang menunjukkan betapa hanya enumerable properti diulangi dengan for x in obj.

Dan sebenarnya, Anda dapat melihat bahwa metode toString() ditandai sebagai enumerable: false dengan kode ini:

function log(x) {
    document.write(JSON.stringify(x));
}

var buz = {
  fog: 'stack'
};

log(Object.getOwnPropertyDescriptor(Object.getPrototypeOf(buz), "toString"));

person jfriend00    schedule 11.11.2015

Untuk menjelaskan kelanjutan jawaban jfriend00, properti data objek di JavaScript memiliki empat atribut yaitu [[configurable]], [[enumerable]], [[writable]] dan [[value]] yang semuanya adalah disetel ke untuk tiga yang pertama nilai defaultnya adalah true dan untuk yang terakhir defaultnya adalah tidak ditentukan.

Katakanlah ada kebutuhan di mana Anda ingin menghindari nilai properti agar tidak dikembalikan dalam perulangan for-in. Anda dapat menulis sebagai

var car = {};
Object.defineProperty(car, 'name',{
enumerable : false,
value : 'BMW'
});
person Airwind711    schedule 11.11.2015