set

Baseline Widely available

This feature is well established and works across many devices and browser versions. It’s been available across browsers since July 2015.

Cú pháp set liên kết một thuộc tính đối tượng với một hàm được gọi khi có nỗ lực thiết lập thuộc tính đó. Nó cũng có thể được sử dụng trong class.

Try it

const language = {
  set current(name) {
    this.log.push(name);
  },
  log: [],
};

language.current = "EN";
language.current = "FA";

console.log(language.log);
// Expected output: Array ["EN", "FA"]

Cú pháp

js
{ set prop(val) { /* … */ } }
{ set [expression](val) { /* … */ } }

Có một số hạn chế cú pháp bổ sung:

  • Setter phải có đúng một tham số.

Tham số

prop

Tên của thuộc tính cần liên kết với hàm đã cho. Giống như các thuộc tính khác trong object initializer, nó có thể là chuỗi literal, số literal, hoặc định danh.

val

Một bí danh cho biến giữ giá trị được cố gắng gán vào prop.

expression

Bạn cũng có thể sử dụng biểu thức cho tên thuộc tính được tính toán (computed property name) để liên kết với hàm đã cho.

Mô tả

Trong JavaScript, setter có thể được dùng để thực thi một hàm bất cứ khi nào có nỗ lực thay đổi giá trị của thuộc tính. Setter thường được dùng cùng với getter.

Một thuộc tính đối tượng là thuộc tính dữ liệu hoặc thuộc tính accessor, nhưng không thể đồng thời là cả hai. Đọc Object.defineProperty() để biết thêm thông tin. Cú pháp setter cho phép bạn chỉ định hàm setter trong object initializer.

js
const obj = {
  set prop() {
    // setter, the code executed when setting obj.prop
  },
}

Các thuộc tính được định nghĩa bằng cú pháp này là các thuộc tính riêng của đối tượng được tạo, và chúng là configurable và enumerable.

Ví dụ

Định nghĩa setter trên đối tượng mới trong object initializer

Ví dụ sau định nghĩa một pseudo-property current của đối tượng language. Khi current được gán một giá trị, nó cập nhật log với giá trị đó:

js
const language = {
  set current(name) {
    this.log.push(name);
  },
  log: [],
};

language.current = "EN";
console.log(language.log); // ['EN']

language.current = "FA";
console.log(language.log); // ['EN', 'FA']

Lưu ý rằng current không được định nghĩa, và bất kỳ nỗ lực truy cập nào cũng sẽ dẫn đến undefined.

Sử dụng setter trong class

Bạn có thể sử dụng cú pháp hoàn toàn tương tự để định nghĩa các public instance setter có sẵn trên các instance của class. Trong class, bạn không cần dấu phẩy phân tách giữa các phương thức.

js
class ClassWithGetSet {
  #msg = "hello world";
  get msg() {
    return this.#msg;
  }
  set msg(x) {
    this.#msg = `hello ${x}`;
  }
}

const instance = new ClassWithGetSet();
console.log(instance.msg); // "hello world"

instance.msg = "cake";
console.log(instance.msg); // "hello cake"

Các thuộc tính setter được định nghĩa trên thuộc tính prototype của class và do đó được chia sẻ bởi tất cả các instance của class. Không giống như các thuộc tính setter trong object literal, các thuộc tính setter trong class không phải là enumerable.

Static setter và private setter sử dụng cú pháp tương tự, được mô tả trong các trang staticprivate elements.

Xóa setter bằng toán tử delete

Nếu bạn muốn xóa setter, bạn có thể delete nó:

js
delete language.current;

Định nghĩa setter trên đối tượng hiện có bằng defineProperty

Để thêm setter vào một đối tượng hiện có, hãy sử dụng Object.defineProperty().

js
const o = { a: 0 };

Object.defineProperty(o, "b", {
  set(x) {
    this.a = x / 2;
  },
});

o.b = 10;
// Runs the setter, which assigns 10 / 2 (5) to the 'a' property

console.log(o.a); // 5

Sử dụng tên thuộc tính được tính toán

js
const expr = "foo";

const obj = {
  baz: "bar",
  set [expr](v) {
    this.baz = v;
  },
};

console.log(obj.baz); // "bar"

obj.foo = "baz";
// Run the setter

console.log(obj.baz); // "baz"

Thông số kỹ thuật

Specification
ECMAScript® 2027 Language Specification
# sec-method-definitions

Tương thích trình duyệt

Xem thêm