Javascript: как назначить сеттер для объекта через знак `=`? - PullRequest
0 голосов
/ 08 апреля 2019

Есть ли способ присвоить установщик / получатель существующему объекту через знак =?

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

Ответы [ 3 ]

4 голосов
/ 08 апреля 2019

Нет, нет.

Если вы хотите назначить установщик или получатель для существующего объекта, используйте defineProperty.

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

window.setter = "Hello";
console.log(window.test);
0 голосов
/ 08 апреля 2019

Я бы сказал нет. Но ответ «да», если вы используете прокси вместо самого объекта.

Но это чёрная магия и, безусловно, НЕ рекомендуется для производства:)

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
0 голосов
/ 08 апреля 2019

Попробуйте эту форму:

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