Kiedy jesteś stringify
ing, stracisz wszystkie obiekty undefined
i funkcję. Zamiast tego, można sprawdzić, czy zwrócony obiekt deskryptor obiekcie non-undefined get
lub set
właściwości i zdecydować, jak to
Jeśli deskryptor nieruchomość ma właściwość value
, jest to normalna właściwość danych.
Jeśli deskryptor właściwości ma właściwości get
i set
, a obie mają funkcje jako wartości, wówczas jest to właściwość akcesor.
Jeśli deskryptor właściwości ma wartość get
jako funkcję, wówczas jest to właściwość getter.
W przeciwnym razie właściwość ustawiająca.
descriptor.hasOwnProperty('value');
// true
Od value
jest tam, jest to normalna właściwość danych.
descriptorGetter.hasOwnProperty('value');
// false
typeof descriptorGetter.get === 'function';
// true
typeof descriptorGetter.set === 'function';
// false
Tutaj value
tam nie ma, ale get
nieruchomość jest funkcją. Więc właściwość gettera.
descriptorSetter.hasOwnProperty('value');
// false
typeof descriptorSetter.get === 'function';
// false
typeof descriptorSetter.set === 'function';
// true
Tutaj również, value
tam nie ma, ale set
nieruchomość jest funkcją. Tak więc właściwość setera.
Poza tym, jeśli miał właściwość dostępowej, jak to
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
Możesz napisać to w zależności, jak to
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")' będzie false, ponieważ 'a' nie jest getter. Gdyby była to funkcja, która wymusiłaby na true, tak wynik końcowy jest jak hasOwnProperty(), ale dla pobierających ... – dandavis