Object ใน JavaScript การแจง property หรือ Enumerating

 method มาตรฐานที่รับสืบทอดมาจะไม่สามารถแจงได้ แต่ property ที่เพิ่มเข้าไปโดยโค้ดตามปกติจะถูกแจงได้

let o = {x: 1, y: 2, z: 3};          // Three enumerable own properties
o.propertyIsEnumerable("toString")   // => false: not enumerable
for(let p in o) {                    // Loop through the properties
    console.log(p);                  // Prints x, y, and z, but not toString
}

การเช็คเพื่อข้าม property ที่สืบทอดมา และข้าม method
for(let p in o) {
    if (!o.hasOwnProperty(p)) continue;       // Skip inherited properties
}
for(let p in o) {
    if (typeof o[p] === "function") continue; // Skip all methods
}

ยังมี mothod ที่สามารถใช้ดึงรายการของชื่อ property ออกมาเป็น array
  • Object.keys() คืนชื่อของ property ที่เป็น enumberable, own properties และชื่อ property ต้องเป็น String (ชื่อที่เป็น Symbol จะถูกข้าม)
  • Object.getOwnPropertyNames()  คืนชื่อของ property ที่เป็น enumberable+non-enumerable, own properties และชื่อ property ต้องเป็น String (ชื่อที่เป็น Symbol จะถูกข้าม)
  • Object.getOwnPropertySymbols() คืนชื่อของ property ที่เป็น Symbol ทั้งหมด
  • Reflect.ownKeys()   คืนชื่อของ property ที่เป็น own property ทั้งหมด enumerable+non-enumberable, string+Symbol

การเรียง property จากการแจง

Array ของชื่อ Property ที่ได้มาจาก method ด้านบนจะเรียงตาม:
  • Property ที่เป็นตัวเลขเต็มบวกจะเริ่มก่อน เรียงจากมากไปหาน้อย
  • ต่อด้วย property ที่มีชื่อเป็น String ซึ่งรวมไปถึงตัวเลขจำนวนลบ โดยจะเรียงตามลำดับที่ถูกใส่เข้ามาใน Object
  • จากนั้นจึงเป็น property ที่มีชื่อเป็น Symbol เรียงตามลำดับที่ถูกใส่เข้ามาใน Object
ลูป for/in ก็จะเรียงตามนี้แต่จะไล่ property ที่เป็นของ object เองจนหมดก่อนที่จะขยับไล่ขึ้นไปตาม prototype chain.


Comments

Popular posts from this blog

15.8.4 การวาดลงบน cavas

15.8.3 Graphics Attributes

Class ใน JavaScript, การสร้าง class ด้วย keyword class