14.1 Property Attributes
แต่ละ property ของ object ใน Javascript จะมี attributes ที่กำหนดว่าสามารถทำอะไรกับ property นั้นๆได้
- writable ถูกเปลี่ยนแปลงค่าได้หรือไม่
- enumerable ถูกแจกแจงด้วย for/in หรือ Object.keys() ได้หรือไม่
- configurable ถูกลบและ ถูกเปลี่ยนเปลง attributes ได้หรือไม่
- value ค่าของ property
Object ที่สร้างขึ้นตามปกติ attributes ทั้งหมดจะมีค่าเป็น true แต่ Object ที่มากับ library มาตรฐานหลายอันจะมีค่าเป็น false
Object ที่ใช่เข้าถึง attributes คือ property descriptor ที่ได้มาจาก function Object.getOwnPropertyDescriptor()
// Returns {value: 1, writable:true, enumerable:true, configurable:true} Object.getOwnPropertyDescriptor({x: 1},"x"); // Here is an object with a read-only accessor property const random = { get octet() { return Math.floor(Math.random() * 256); }, }; // Returns { get: /*func*/, set:undefined, enumerable:true, configurable:true} Object.getOwnPropertyDescriptor(random, "octet"); // Returns undefined for inherited properties and properties that don't exist. Object.getOwnPropertyDescriptor({},"x") // => undefined; no such prop Object.getOwnPropertyDescriptor({}, "toString") // => undefined; inherited
ใช้ function Object.defineProperty() เพื่อตั้งค่า attribute ของ property หรือสร้าง property ใหม่ที่มีค่า attribute ตามที่ต้องการ
let o = {}; // Start with no properties at all // Add a non-enumerable data property x with value 1. Object.defineProperty(o, "x", { value: 1, writable: true, enumerable: false, configurable: true }); // Check that the property is there but is non-enumerable o.x // => 1 Object.keys(o) // => [] // Now modify the property x so that it is read-only Object.defineProperty(o, "x", { writable: false }); // Try to change the value of the property o.x = 2; // Fails silently or throws TypeError in strict mode o.x // => 1 // The property is still configurable, so we can change its value like this: Object.defineProperty(o, "x", { value: 2 }); o.x // => 2 // Now change x from a data property to an accessor property Object.defineProperty(o, "x", { get: function() { return 0; } }); o.x // => 0
Attribute ที่ไม่กำหนดให้จะมีค่าเป็น
- false หรือ undefined ในกรณีที่สร้าง property ใหม่
- ไม่มีการเปลี่ยนแปลงในกรณีที่เป็นการแก้ไข property เดิม
Object.defineProperty() จะใช้ได้กับ property ที่เป็นของตัว object เองเท่านั้น
ใช้ Object.defineProperties() สำหรับ property หลายๆตัว
let o = {}
let p = Object.defineProperties(o, { x: { value: 1, writable: true, enumerable: true, configurable: true }, y: { value: 1, writable: true, enumerable: true, configurable: true }, r: { get() { return Math.sqrt(this.x*this.x + this.y*this.y); }, enumerable: true, configurable: true } }); p.r // => Math.SQRT2
defineProperties และ defineProperty จะคืนค่าเป็น object ที่ถูกแก้ไข ทั้ง o และ p จะชี้ไปยัง object เดียวกัน
Comments
Post a Comment