ใน Javascript forin จะไม่วนซ้ำคุณสมบัติของต้นแบบใช่ไหม

บน MDN (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/hasOwnProperty) ฉันเห็นตัวอย่างดังนี้:

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
  }
}

ในตัวอย่างข้อมูล console.log(name); // toString or something else ดูทำให้ฉันสับสนเล็กน้อย ฉันเข้าใจว่า toString เป็นคุณสมบัติของ Object.prototype และคุณสมบัตินี้สามารถเข้าถึงได้โดย buz.toString

อย่างไรก็ตาม เมื่อฉันเรียกใช้ตัวอย่างใน Chrome ฉันไม่เห็นคุณสมบัติ toString ถูกพิมพ์ (console.log) แม้ว่าความคิดเห็นจะบอกว่าควรวนซ้ำด้วย for..in และพิมพ์ ..

ใครบ้างมีความคิดเกี่ยวกับสาเหตุที่คุณสมบัติจากต้นแบบไม่สามารถวนซ้ำด้วย "for..in" ได้


person Hanfei Sun    schedule 11.11.2015    source แหล่งที่มา
comment
Object.prototype.toString เป็นคุณสมบัติที่ไม่สามารถนับได้   -  person Bergi    schedule 11.11.2015


คำตอบ (2)


for x in obj วนซ้ำเฉพาะคุณสมบัติที่นับได้ของวัตถุ (รวมถึงคุณสมบัติบนต้นแบบด้วย) คุณสมบัติที่กำหนดสามารถทำเครื่องหมายว่านับได้หรือไม่ ดังนั้น หาก for/in ข้ามคุณสมบัติบางอย่าง อาจเป็นเพราะคุณสมบัตินั้นไม่ได้รับการกำหนดค่าให้นับได้

ดูการสาธิตการทำงานที่นี่: http://jsfiddle.net/jfriend00/gyc9gnmj/ ที่แสดงให้เห็นว่านับได้เพียงเท่าใด คุณสมบัติถูกวนซ้ำด้วย for x in obj

และในความเป็นจริง คุณจะเห็นว่าเมธอด toString() ถูกทำเครื่องหมายเป็น enumerable: false ด้วยโค้ดนี้:

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

เพียงเพื่อให้ความกระจ่างมากขึ้นเกี่ยวกับสิ่งที่ jfriend00 ตอบไปแล้ว คุณสมบัติข้อมูลของ Object ใน JavaScript มีแอตทริบิวต์สี่อย่าง ได้แก่ [[configurable]], [[enumerable]], [[writable]] และ [[value]] ซึ่งทั้งหมดนี้คือ ตั้งค่าเป็นสามค่าก่อนหน้า ค่าเริ่มต้นจะเป็นจริง และค่าสุดท้ายเป็นค่าเริ่มต้นเป็นไม่ได้กำหนด

สมมติว่ามีความจำเป็นที่คุณต้องการหลีกเลี่ยงค่าของคุณสมบัติที่จะไม่ส่งคืนในลูป for-in คุณสามารถเขียนเป็น

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