Search code examples
javascriptecmascript-6getter-setter

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


Is there way to assign setter/getter to existing object via = sign?

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

Solution

  • I'd say no. But the answer is "kinda yes" if you use a proxy instead of the object itself.

    But this is black magic and by all means is NOT recommended for production :)

    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