Thuộc tính của Object

Khai báo thuộc tính

Trong mỗi thuộc tính của object ngoài giá trị còn có các cờ sau:

  • writable nếu là true thì thuộc tính này có thể thay đổi được, nếu không thì nó chỉ là thuộc tính chỉ đọc.
  • enumerable nếu là true thì đây thuộc tính có thể liệt kê được qua vòng lặp for...in hoặc phương thức Object.keys, nếu không thì thuộc tính này sẽ không được liệt kê.
  • configurable nếu là true thì đây là thuộc tính có thể xóa được và có thể chỉnh sửa các thông số khác của thuộc tính.

Hàm Object.getOwnPropertyDescriptor(object, propName) sẽ lấy thông tin đầy đủ về thuộc tính của object.

Ví dụ

1
2
3
4
5
let user = {
  name: "Bill"
};
console.log(Object.getOwnPropertyDescriptor(user, 'name'));
/* -> { value: "Bill", writable: true, enumerable: true, configurable: true } */

Hàm Object.defineProperty(object, propName, props) sẽ tạo mới hoặc cập nhật thông tin thuộc tính của object. Các giá trị writable, enumerable, configurable mặc định của hàm này là false.

Ngoài ra hàm Object.defineProperties(object, props) sẽ định nghĩa nhiều thuộc tính của object cùng một lúc. Tham số props là object có dạng key/value trong đó key là tên thuộc tính, value là thông số của thuộc tính.

Thuộc tính chỉ đọc

Cập nhật thuộc tính không liệt kê với hàm Object.defineProperty.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
"use strict"; // thêm "use strict" để hiển lỗi
let user = {
  name: "Bill"
};

// cập nhật thuộc tính của object
Object.defineProperty(user, 'name', {
  value: "John", // cập nhật value
  writable: false, // thuộc tính chỉ đọc
});

// kiểm tra lại xem có thay đổi được user.name không
user.name = "Bill"; // lỗi vì đây là thuộc tính chỉ đọc

Thuộc tính không liệt kê

Ví dụ sau đây cập nhật thuộc tính không liệt kê với hàm Object.defineProperties.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
let user = {
  name: "John",
  toString() {
    return this.name;
  }
};

Object.defineProperties(user, {
  "toString": {
    enumerable: false
  }
});

// hàm toString không được liệt kê trong user
for (let key in user) {
  console.log(key); // name
}

Thuộc tính không config

Các thuộc tính không config thường là các thuộc tính của hệ thống ví dụ hằng số Math.PI.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
let descriptor = Object.getOwnPropertyDescriptor(Math, 'PI');
console.log(descriptor);
/*
{
  "value": 3.141592653589793,
  "writable": false,
  "enumerable": false,
  "configurable": false
}
*/

Khi mà thuộc tính không config, khi đó chúng ta sẽ:

  • Không thể thay đổi được flag configurable
  • Không thay đổi được flag enumerable
  • Không thay đổi được flag writable từ false sang true (nhưng có thể thay đổi ngược lại)
  • Không thể thay đổi hàm set, get nếu nó đã tồn tại

Hàm Object.defineProperty(object, propName, props) ngoài định nghĩa cờ của object có thể định nghĩa hàm get và set.