Получить функцию Getter в Javascript
в JavaScript есть возможность создавать геттеры и сеттеры следующим образом:
function MyClass(){
var MyField;
this.__defineGetter__("MyField",function(){
return MyField;
});
this.__defineSetter__("MyField",function(value){
MyField = value;
});
}
но есть ли способ получить функцию Getter или Setter? Я думаю о чем-то вроде этого:--3-->
var obj = new MyClass();
obj.__getSetter__("MyField")("MyValue");
мне нужна такая функциональность для расширения базовых классов. Например: Класс " A "имеет поле" a", Класс" B "простирается от" A", а также хочет иметь поле"a". Чтобы передать значения из"a" -поля " B "- объекта в"a" -поле"A" -объекта, мне нужно получить функция setter / getter перед их переопределением.
4 ответов
старый способ
__defineGetter
и __defineSetter__
были устаревшими в то время, как этот вопрос был первоначально опубликован.
доступ к этим функциям доступа и мутатора обрабатывался с помощью __lookupGetter__
и __lookupSetter__
соответственно.
пример
function MyClass() {
var MyField
this.__defineGetter__("MyField",function(){
return MyField
})
this.__defineSetter__("MyField",function(value){
MyField = value
})
}
var obj = new MyClass()
obj.__lookupSetter__("MyField")("MyValue")
console.log(obj.MyField)
новый путь
текущий стандартный способ создания динамического accessor или мутатор должен использовать Object.defineProperty
или Object.defineProperties
.
доступ к функциям доступа и мутатора можно сделать с помощью Object.getOwnPropertyDescriptor
и Object.getOwnPropertyDescriptors
.
пример
function MyClass() {
let MyField
Object.defineProperty(this, 'MyField', {
get: () => MyField,
set: value => {
MyField = value
}
})
}
var obj = new MyClass()
Object.getOwnPropertyDescriptor(obj, 'MyField').set('MyValue')
console.log(obj.MyField)
классы ЕС6
отметим, что Object.getOwnPropertyDescriptor
работает даже при использовании get
и set
ключевые слова, однако есть пара gotchas, если вы используете class
ключевое слово.
аксессоры и мутаторы, определенные на class
не являются "собственными свойствами" экземпляров этого класса. Вместо этого они принадлежат прототипу для этого класса (class
это просто синтаксический сахар для объявления прототипа).
поскольку функции, добавленные в класс, добавляются в прототип, вам нужно будет быть осторожным с контекстом при вызове геттера или сеттера.
class MyClass {
get MyField() {
return this._myField
}
set MyField(value) {
this._myField = value
}
}
const obj = new MyClass()
Object.getOwnPropertyDescriptor(MyClass.prototype, 'MyField').set.call(obj, 'MyValue')
console.log(obj.MyField)
на самом деле __lookupGetter__
и __lookupSetter__
методы устаревший. Вместо них вы должны использовать:
/* __lookupGetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').get;
/* __lookupSetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').set;
в Google Chrome lookupGetter/lookupSetter сломан:http://code.google.com/p/chromium/issues/detail?id=13175