0
votes

JavaScript: Comment assigner Setter à l'objet via `=` signe?

est à quoi assigner Setter / Getter à l'objet existant via = signe? XXX


3 commentaires

Voulez-vous avoir plusieurs fonctions de setter différentes avec le même nom / sous la même propriété?


Je veux avoir un setter pour une propriété, avec le même nom si c'est possible et sans objet.define () .


Quel est le problème avec objet.defineproperty ? La question ressemble à Le XY problème


3 Réponses :


-5
votes

Essayez ce formulaire:

window.somesetter = function (v) {};


1 commentaires

Ce n'est ni un getter / Setter ni différent du deuxième exemple de la question de l'OP.



4
votes

non, il n'y a pas.

Si vous souhaitez affecter un seigteur ou getter à un objet existant, utilisez defineProperty code>. p>

P>

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

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


1 commentaires

Cela fera une propriété avec configurable et énumérable false, ce qui n'est pas identique.



0
votes

Je dirais non. Mais la réponse est "un peu oui" si vous utilisez un proxy au lieu de l'objet lui-même.

Mais c'est la magie noire et par tous les moyens est pas recommandé em> pour la production :) p>

p>

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 commentaires