2016-06-14 18 views
16

posso avere getter in oggetto JavaScript come questoJavascript: Come aggiungere getter a un oggetto esistente

var member = { 
    firstName:"XYZ", 
    lastName:"zzz", 
    get fullName(){ return (this.firstName + ' ' + this.lastName); } 
} 

E posso anche aggiungere altre proprietà al volo come questo

member.isGuest = true; 

Ma è c'è un modo in cui possiamo aggiungere getter ad un oggetto già esistente? Qualcosa di simile

member.isGuest = get isGuest(){ return this.firstName=='Guest'; } 

risposta

20

provare defineProperty

Object.defineProperty(member, 'isGuest', { 
    get: function() { return this.firstName=='Guest' } 
}); 
7

È possibile utilizzare la nuova Object.defineProperty in questo modo:

Object.defineProperty(
    member, 
    'prop', 
    { 
     get: function() { 
      return this.lastName.toUpperCase() 
     } 
    } 
); 

In passato era necessario utilizzare __defineGetter__ ma ora è stato sconsigliato.

+0

Ti meriti un upvote per un errore FGITW. (In realtà hai più contenuti!) – wizzwizz4

-3

È possibile utilizzare solo ottenere e impostare in una classe, Significa che metodo getter e setter. ma è possibile aggiungere una funzione alla classe:

member.isGuest = function isGuest(){ return this.firstName=='Guest';} 

member.isGuest() 

ottenere significa che la proprietà può essere letto! il set significa che la proprietà può essere scritta! Puoi cercarlo nel libro "JavaScript: The.Definitive.Guide" 6edition the 6 chapter!

+0

Questo è definitivamente errato. Puoi usare 'get' e' set' su qualsiasi oggetto anonimo. Come 'let obj = {get foo() {return 'foo'}}'. Vedi il primo esempio qui: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Functions/get – tandrewnichols

0

Inoltre, puoi aggiungere un getter personalizzato e conservare il vecchio valore se non si suppone venga calcolato da altri valori, come nel tuo esempio. Per fare ciò, crea un ulteriore livello di contesto usando una funzione anonima come questa:

(function(){ 
    var oldValue = yourObject[targetProperty]; 
    var currentValue = oldValue; 
    var getter = function() { 
     return currentValue; // or do something before returning, like applying parseInt or whatever 
    }; 
    var setter = function(newValue) { 
     currentValue = newValue; // or add some customization as well 
    }; 
    Object.defineProperty(yourObject,targetProperty,{ 
     get: getter, 
     set: setter, 
     enumerable: true, // depending on your needs 
     configurable: true // depending on your needs 
    }); 
})(); 
Problemi correlati