Phương thức Get và Set

Phương thức get và set

Nếu không muốn sử dụng phương thức get và set mặc định của object thì chúng ta có thể thay đổi các hàm này. Hàm set được gọi khi ghi giá trị vào thuộc tính, hàm get sẽ chạy khi chúng ta đọc giá trị từ thuộc tính.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
let user = {
  name: "John",
  surname: "Smith",

  get fullName() {
    return `${this.name} ${this.surname}`;
  },
  set fullName(value) {
    [this.name, this.surname] = value.split(" ");
  }
};
user.fullName = "Bill Gates"; // gọi hàm set fullName()

// trả về Bill Gates
console.log(user.fullName); // gọi hàm get fullName()

// trả về { 
// name: "Bill", 
// surname: "Gates", 
// fullName: "Bill Gates"
// }
console.log(user);

for(let key in user) {
  console.log(key); // name, surname, fullName
}

Sử dụng hàm Object.defineProperty()

Khi sử dụng hàm defineProperty mà định nghĩa hai hàm get hoặc set thì không thể set giá trị writable. Giá trị writable lúc này được xem là true.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
let user = {
  name: "John",
  surname: "Smith"
};

// mặc định enumerable, configurable của fullName đều là false,
// writable được xem là true
Object.defineProperty(user, 'fullName', {
  get() {
    return `${this.name} ${this.surname}`;
  },
  set(value) {
    [this.name, this.surname] = value.split(" ");
  }
});

user.fullName = "Bill Gates";
console.log(user.fullName); // Bill Gates

for (let key in user) {
  console.log(key); // name, surname
}
console.log(user); // { name: "Bill", surname: "Gates" }

console.log(Object.getOwnPropertyDescriptor(
  user,
  'fullName'
));
// { get: [Function: get], set: [Function: set], 
// enumerable: false, configurable: false }