2011-12-21 10 views
26

È possibile, dato un oggetto e il nome della proprietà determinare se tale proprietà è definita utilizzando un getter o setter, o è completamente trasparente? Voglio solo definire un getter/setter se non ce n'è già uno definito sulla proprietà.Determina se una proprietà JavaScript ha un getter o setter definito?

Ho bisogno che funzioni in WebKit/Firefox.

+0

Come sono i tuoi getter e setter metodi definiti? ** getSomething ** e ** setSomething **? –

+2

No, utilizzando getter e setter effettivi di JavaScript con '__defineGetter__' e' __defineSetter__'. – devios1

risposta

30
+1

OK in questo caso non credo sia possibile, a meno che Safari supporti anche 'lookupGetter' https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/LookupGetter – Graham

+0

Aha, lo fa! Eccellente! – devios1

+0

Il mio male: sembra che Safari * supporti * getOwnPropertyDescriptor', ma l'ho perso perché è una proprietà sull'oggetto 'Object'. Sembra essere il modo più standard per farlo, anche se preferisco la sintassi di chiamare una funzione sull'oggetto in questione. – devios1

23

È possibile utilizzare Object.getOwnPropertyDescriptor(obj, prop)

Ad esempio:

var obj = { first: 1 } 
obj.__defineGetter__('second', function() { return 2; }); 

// get descriptors 
var descriptor1 = Object.getOwnPropertyDescriptor(obj, 'first'); 
var descriptor2 = Object.getOwnPropertyDescriptor(obj, 'second'); 

// check if it's a getter 

descriptor2.get 
// returns function() { return 2; } 

descriptor1.get 
// returns undefined 
+3

Jim ottiene il mio voto per avere l'esempio in linea. BOOM. – deepelement

+0

Si noti che è get ** Own ** PropertyDescriptor, quindi non includerà le proprietà ereditate o quelle definite sul prototipo. – gronostaj

0

trovare il modello oggetto di esempio per il vostro requisito java script:

var Man=function(n,a){ 
    var name,age; 

    function getName(){ 
     return this.name; 
    } 

    function getAge(){ 
     return this.age; 
    } 
    function create(){ 
     this.name=n; 
     this.age=a; 
     console.log('new object created'); 
    } 

    function setAge(age){ 
     this.age=age; 
    } 

    function setName(name){ 
     this.name=name; 
    } 
    return{ 
    name:n, 
    age:a, 
    getName:getName, 
    getAge:getAge, 
    setName:setName, 
    setAge:setAge 
    }; 
} 

var m1=new Man('Chaiguy',30); 

// To check if Property exist for an Object 
console.log(m1.hasOwnProperty('name')); 

// To get the name and age of the object 

console.log(m1.getName()+' is '+m1.getAge()+' years old.'); 
0

Object.defineProperty'sget o set valore predefinito Metodo sarà indefinito se il suo n o definito nel descrittore. Questo è il modo ideale per identificare.

Diciamo esempio:

var User = {}; 

Object.defineProperty(User, 'name', { 
    get: function() { 
     return _name; 
    }, 
    enumerable: true 
}); 

Object.defineProperty(User, 'designation', { 
    get: function() { 
     return _designation; 
    }, 
    set: function (val) { 
     _designation = val; 
    }, 
    enumerable: true 
}); 


var d = Object.getOwnPropertyDescriptor(User, 'name'); 
console.log(d.set == undefined); 

Riferimento: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

2

È possibile utilizzare Object.getOwnPropertyDescriptor(obj, prop).

function isGetter (obj, prop) { 
    return !!Object.getOwnPropertyDescriptor(obj, prop)['get'] 
} 

Usage:

obj = { 
    foo: 'foo', 
    get bar() { return 'bar' } 
} 

isGetter(obj, 'bar') // will return true 
isGetter(obj, 'foo') // will return false 
+0

Questa risposta è un aggiornamento della risposta di Jim Schubert poiché ['__defineGetter__' è stato deprecato] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object/__defineGetter__) dal 2011. –

+2

La mia intenzione originale era di modificare la risposta di Jim a _ "aggiungere aggiornamenti come post-età" _ come è menzionato in [Guida per gli overflow dello stack> Perché le persone possono modificare i miei post? Come funziona la modifica?] (Https://stackoverflow.com/help/editing). Questa modifica è stata rifiutata con il motivo: _ "Questa modifica aveva lo scopo di indirizzare l'autore del post e non ha senso come modifica. Dovrebbe essere stato scritto come commento o risposta. "_. Quindi questa è la ragione di questa risposta. –

Problemi correlati