Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> JavaScript

Non-enumerable Property ใน JavaScript และการสร้างด้วย Object.defineProperty

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

FlagDefaultความหมาย
enumerablefalse (defineProperty)โผล่ใน Loop/keys()
writablefalse (defineProperty)แก้ไขค่าได้
configurablefalse (defineProperty)ลบ/เปลี่ยน Descriptor ได้
valueundefinedค่าของ Property
get/setundefinedAccessor 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