Non-enumerable Property
Property ที่ ไม่แสดงในการ Iterate (for...in, Object.keys(), JSON.stringify) แต่เข้าถึงได้ปกติ
การสร้างด้วย Object.defineProperty()
<script>
const person = {name: 'Gopal'};
person.age = '21';
person['country'] = 'India';
// สร้าง Non-enumerable Property
Object.defineProperty(person, 'salary', {
value: '80,000$',
enumerable: false, // Key Point!
writable: false, // Read-only (Optional)
configurable: false // Cannot delete/redefine (Optional)
});
console.log(Object.keys(person)); // ['name', 'age', 'country']
console.log(person.salary); // '80,000$' - Accessible!
console.log('salary' in person); // true
</script>
ผลลัพธ์
['name', 'age', 'country']
Property Descriptor Flags
| Flag | Default | ความหมาย |
|---|---|---|
| enumerable | false (defineProperty) | โผล่ใน Loop/keys() |
| writable | false (defineProperty) | แก้ไขค่าได้ |
| configurable | false (defineProperty) | ลบ/เปลี่ยน Descriptor ได้ |
| value | undefined | ค่าของ Property |
| get/set | undefined | Accessor Functions |
การใช้งานจริง
- Internal/Private Data: ซ่อน Implementation Detail
- Metadata: เก็บข้อมูลเสริมไม่ให้ Loop โดน
- Library Internals: ป้องกัน User แก้ไข Critical Property
ตรวจสอบ Enumerability
Object.propertyIsEnumerable('salary'); // false
Object.getOwnPropertyDescriptor(person, 'salary').enumerable; // false
Symbol Properties (Alternative)
const sym = Symbol('secret');
const obj = {[sym]: 'hidden'};
Object.keys(obj); // [] - Symbol ไม่ Enumerable โดย Default