2015-04-30 18 views
8

Mi chiedo se è possibile avere un setter per una proprietà dinamica in Javascript?Setter per una proprietà dinamica in javascript

Quindi questo:

var myobj = new MyObj(); 

myobj.a_custom_prop = 'something'; 

chiamerei una funzione in grado di recuperare 'a_custom_prop' e 'qualcosa di'

Per essere chiari, vorrei una funzione simile a:

MyObj.property.define = function (prop, value) { }; 

da chiamare in questo modo:

myobj.prop = value; 

invece di:

myobj.define('prop', value); 

Sapendo che il nome della proprietà non è relativa alla statica myobj, altrimenti avrei usato:

Object.defineProperty(MyObj.prototype, 'a_custom_prop', { 
    set: function (value) { /*...*/ } 
}); 
+0

Interessante domanda. –

+0

Quindi sarebbe una specie di "setter catch-all", incorporato nella lingua stessa (nessuna funzione)? Questo è qualcosa che vorrei vedere. –

+0

Stai cercando qualcosa come overload setter in PHP? Se sì, questo non è possibile in JavaScript, purtroppo. –

risposta

0

Non potresti usare qualcosa di simile?

function MyObj(){ 
... 
this.dynamicPropertyName = 'something'; 
... 
} 
MyObj.prototype.setThatProp = function(i){ 
this[this.dynamicPropertyName] = i; 
} 
... 
var myObj = new MyObj(); 
myObj.setThatProp(5); 

EDIT:

O qualcosa di simile:

MyObj.prototype.__defineSetter__('prop', function(val){ this[this.dynamicPropertyName] = val; }); 
... 
var myObj = new MyObj(); 
myObj.prop = 5; 

Esempio utilizzo:

console test

+0

Sì ma come detto, è esattamente quello che voglio evitare. Inoltre, devi impostare 'dynamicPropertyName' prima di chiamare setThatProp, com'è diverso dal chiamare' setThatProp ('dynamicPropName', value) '? – Ervadac

+0

Ok ho notato che non è esattamente quello che vuoi - ha fatto una modifica. Inoltre, non è statico, puoi cambiare myObj.dynamicPropertyName in qualsiasi momento e il setter funzionerà ancora. In entrambi i casi, se non ho trascurato qualcosa. – ElDoRado1239

+0

Nel secondo esempio, "prop" non è dinamico, deve essere definito prima di chiamare 'myObj.prop = value' – Ervadac

-1

No, non è attualmente possibile.

+0

Questo non fornisce una risposta alla domanda. Per criticare o richiedere chiarimenti da un autore, lascia un commento sotto il loro post. – Riad

+2

Sì, sì. * Mi chiedo se è possibile avere un setter per una proprietà dinamica in Javascript? * È la domanda, e ho dato la risposta. –

+1

Sì, non ho il downvote. Ecco qui, torna a zero. ^^ – ElDoRado1239

2

Come Yoshi ha dichiarato in un commento, potrebbe essere possibile utilizzare Object.observe() dal Bozza ES7.

Tuttavia non è esattamente un "setter catch-all" perché verrà attivato solo dopo la proprietà è stata modificata, non prima. Quindi, se per esempio si desidera memorizzare la proprietà da qualche altra parte, sarà necessario farlo delete. Poiché la richiamata observe è asincrona, verrà eseguita dopo il callstack corrente, il che significa che il nuovo valore può essere immediatamente utilizzato prima di essere modificato.

Inoltre, Chrome solo per ora.

Il seguente frammento esegue alcune manipolazioni sull'oggetto tramite l'impostazione nativa e utilizza Object.observe.Si registra nel seguente ordine:

  1. ho aggiunto questo valore: foobar
  2. Il callback recupera: foobar
  3. Valore della foo.bar dopo la cancellazione: undefined

Qui va:

var foo = {}; 

Object.observe(foo, function(changes) { 
    var lastChanges = changes[changes.length - 1], 
     newValue = lastChanges.object[lastChanges.name]; 

    console.log('The callback retrieves: ' + newValue); 
    delete lastChanges.object[lastChanges.name]; 
}, ['add']); 

foo.bar = 'foobar'; //Log n°2 
console.log('I added this value: ' + foo.bar); //Log n°1 
setTimeout(function() { 
    console.log('Value of foo.bar after deletion: ' + foo.bar); //Log n°3 
}, 0); //Execute after the observe callback 

A causa del fac Che sia nella bozza ES7, la precedente potrebbe essere completamente sbagliata a seconda di quando leggi questo.

Problemi correlati