Javascript:如何通过 `=` 符号将 setter 分配给对象?

Javascript: how to assign setter to object via `=` sign?

有没有办法通过 = 符号将 setter/getter 分配给现有对象?

window.somesetter = set(v) {};
window.somesetter = function set(v) {};
window.somesetter = set settername(v) {};

试试这种形式:

window.somesetter = function (v) {};

没有,没有。

如果要将 setter 或 getter 分配给现有对象,请使用 defineProperty

Object.defineProperty(window, 'setter', {
  set: function(value) { window.test = value }
});

window.setter = "Hello";
console.log(window.test);

我会说不。但如果您使用代理而不是对象本身,答案是 "kinda yes"。

但这是黑魔法,无论如何不推荐用于生产:)

const winProxy = new Proxy(window, {
  set(target, name, value) {
    if (typeof value === 'function' && {set: 1, get: 1}[value.name]) {
      const descriptor = Reflect.getOwnPropertyDescriptor(target, name) || {
        enumerable: false, 
        configurable: true,
      }
      
      descriptor[value.name] = value
      
      Reflect.defineProperty(target, name, descriptor)
      
    } else {
      Reflect.set(target, name, value)
    }
  }
})

winProxy.someProp = function set(v) {
  console.log('setter', v);
}

winProxy.someProp = function get() {
  console.log('getter')
}

window.someProp = 1;
window.someProp