Получить функцию 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;

посмотри lookupGetter.


в Google Chrome lookupGetter/lookupSetter сломан:http://code.google.com/p/chromium/issues/detail?id=13175