Quando si è stringify
ING, si perderanno tutti gli oggetti undefined
e la funzione. Invece, è possibile verificare se l'oggetto descrittore di beni restituiti ha un non-undefined get
o set
proprietà e decidere come questo
Se il descrittore di proprietà ha una proprietà value
, si tratta di una proprietà data normale.
Se il descrittore di proprietà ha proprietà get
e set
ed entrambi hanno funzioni come valori, è una proprietà di accesso.
Se il descrittore di proprietà ha il valore di get
come funzione, è una proprietà getter.
In caso contrario, una proprietà di setter.
descriptor.hasOwnProperty('value');
// true
Dal value
c'è, si tratta di una proprietà data normale.
descriptorGetter.hasOwnProperty('value');
// false
typeof descriptorGetter.get === 'function';
// true
typeof descriptorGetter.set === 'function';
// false
Qui, value
non c'è, ma get
proprietà è una funzione. Quindi una proprietà getter.
descriptorSetter.hasOwnProperty('value');
// false
typeof descriptorSetter.get === 'function';
// false
typeof descriptorSetter.set === 'function';
// true
Anche qui, value
non c'è, ma set
proprietà è una funzione. Quindi una proprietà setter.
A parte questo, se si ha una proprietà di accesso, come questo
var o = {
get cabbage() {
return 'cabbage';
},
set cabbage(value) {
this._cabbage = value;
},
};
descriptorCabbage = Object.getOwnPropertyDescriptor(o, 'cabbage');
console.log(descriptorCabbage.hasOwnProperty('value'));
// false
console.log(typeof descriptorCabbage.get === 'function');
// true
console.log(typeof descriptorCabbage.set === 'function');
// true
È possibile scrivere questo come una funzione, come questo
function getTypeOfProperty(object, property) {
var desc = Object.getOwnPropertyDescriptor(object, property);
if (desc.hasOwnProperty('value')) {
return 'data';
}
if (typeof desc.get === 'function' && typeof desc.set === 'function') {
return 'accessor';
}
return typeof desc.get === 'function' ? 'getter' : 'setter';
}
console.log(getTypeOfProperty(o, 'foo'));
// data
console.log(getTypeOfProperty(o, 'bar'));
// getter
console.log(getTypeOfProperty(o, 'bam'));
// setter
console.log(getTypeOfProperty(o, 'cabbage'));
// accessor
'({a: 1})! .__ lookupGetter __ ("a")' sarà falso poiché 'a' non è un getter. Se fosse la funzione si sarebbe trasformata in true, quindi il risultato finale è come hasOwnProperty(), ma per i getter ... – dandavis