14.1 Property Attributes

 แต่ละ property ของ object ใน Javascript จะมี attributes ที่กำหนดว่าสามารถทำอะไรกับ property นั้นๆได้

  1. writable ถูกเปลี่ยนแปลงค่าได้หรือไม่
  2. enumerable ถูกแจกแจงด้วย for/in หรือ Object.keys() ได้หรือไม่   
  3. configurable ถูกลบและ ถูกเปลี่ยนเปลง attributes ได้หรือไม่
  4. value ค่าของ property
Object ที่สร้างขึ้นตามปกติ attributes ทั้งหมดจะมีค่าเป็น true แต่ Object ที่มากับ library มาตรฐานหลายอันจะมีค่าเป็น false 

Property Type

writable

enumerable

configurable

value

set

get

data properties

boolean

boolean

boolean

variant

NA

NA

accessor properties

NA

boolean

boolean

NA

function

function


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

Popular posts from this blog

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

15.8.3 Graphics Attributes

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