Object.prototype.__defineSetter__()

Deprecated: This feature is no longer recommended. Though some browsers might still support it, it may have already been removed from the relevant web standards, may be in the process of being dropped, or may only be kept for compatibility purposes. Avoid using it, and update existing code if possible; see the compatibility table at the bottom of this page to guide your decision. Be aware that this feature may cease to work at any time.

Note: Tính năng này đã bị loại bỏ và thay thế bằng cách định nghĩa setter sử dụng cú pháp khởi tạo đối tượng hoặc API Object.defineProperty(). Hành vi của phương thức này chỉ được chỉ định nhằm đảm bảo tương thích web, và không bắt buộc phải được triển khai trên mọi nền tảng. Nó có thể không hoạt động ở mọi nơi.

Phương thức __defineSetter__() của các thực thể Object gắn một thuộc tính của đối tượng với một hàm sẽ được gọi khi có thao tác cố gắng gán giá trị cho thuộc tính đó.

Cú pháp

js
__defineSetter__(prop, func)

Tham số

prop

Một chuỗi chứa tên của thuộc tính mà setter func được gắn vào.

func

Một hàm được gọi khi có thao tác cố gắng gán giá trị cho thuộc tính đã chỉ định. Hàm này nhận tham số sau:

val

Giá trị được cố gắng gán cho prop.

Giá trị trả về

Không có (undefined).

Ngoại lệ

TypeError

Được ném ra nếu func không phải là một hàm.

Mô tả

Tất cả các đối tượng kế thừa từ Object.prototype (tức là tất cả ngoại trừ đối tượng có prototype là null) đều kế thừa phương thức __defineSetter__(). Phương thức này cho phép định nghĩa một setter trên một đối tượng đã tồn tại. Điều này tương đương với Object.defineProperty(obj, prop, { set: func, configurable: true, enumerable: true }), nghĩa là thuộc tính có thể liệt kê được và có thể cấu hình được, và bất kỳ getter nào đã tồn tại, nếu có, sẽ được giữ nguyên.

__defineSetter__() được định nghĩa trong đặc tả là "normative optional", nghĩa là không có triển khai nào bắt buộc phải hỗ trợ nó. Tuy nhiên, tất cả các trình duyệt chính đều triển khai nó, và do việc sử dụng liên tục, nó khó có thể bị loại bỏ. Nếu một trình duyệt triển khai __defineSetter__(), nó cũng cần triển khai các phương thức __lookupGetter__(), __lookupSetter__(), và __defineGetter__().

Ví dụ

Sử dụng __defineSetter__()

js
const o = {};
o.__defineSetter__("value", function (val) {
  this.anotherValue = val;
});
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5

Định nghĩa thuộc tính setter theo cách chuẩn

Bạn có thể sử dụng cú pháp set để định nghĩa setter khi đối tượng được khởi tạo lần đầu.

js
const o = {
  set value(val) {
    this.anotherValue = val;
  },
};
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5

Bạn cũng có thể sử dụng Object.defineProperty() để định nghĩa setter trên một đối tượng sau khi nó đã được tạo. So với __defineSetter__(), phương thức này cho phép bạn kiểm soát khả năng liệt kê và khả năng cấu hình của setter, cũng như định nghĩa các thuộc tính symbol. Phương thức Object.defineProperty() cũng hoạt động với đối tượng có prototype là null, vốn không kế thừa từ Object.prototype và do đó không có phương thức __defineSetter__().

js
const o = {};
Object.defineProperty(o, "value", {
  set(val) {
    this.anotherValue = val;
  },
  configurable: true,
  enumerable: true,
});
o.value = 5;
console.log(o.value); // undefined
console.log(o.anotherValue); // 5

Thông số kỹ thuật

Specification
ECMAScript® 2027 Language Specification
# sec-object.prototype.__defineSetter__

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

Xem thêm