Получить функцию Getter в Javascript

В JavaScript есть возможность создавать геттеры и сеттеры следующим образом:

function MyClass(){
 var MyField;
 this.__defineGetter__("MyField",function(){
  return MyField;
 });
 this.__defineSetter__("MyField",function(value){
  MyField = value;
 });
}

Но есть ли способ получить ФУНКЦИЮ Getter или Setter? Я думаю о чем-то вроде этого:

var obj = new MyClass();
obj.__getSetter__("MyField")("MyValue");

Мне нужна такая функциональность при расширении базовых классов. Например: класс «А» имеет поле «а», класс «В» расширяется от «А» и также хочет иметь поле «а». Чтобы передать значения из поля «a» объекта «B» в поле «a» объекта «A», мне нужно получить функцию установки/получения перед их переопределением.


person Van Coding    schedule 27.01.2011    source источник
comment
Я бы посоветовал не полагаться на этот нестандартный синтаксис.   -  person ChaosPandion    schedule 28.01.2011
comment
вы можете добавить ответ как ответ и выбрать его, так как вы нашли его для себя   -  person zzzzBov    schedule 28.01.2011


Ответы (4)


По старому

__defineGetter и __defineSetter__ устарели с тех пор, как этот вопрос был первоначально опубликовано.

Доступ к этим функциям доступа и изменения осуществлялся с помощью __lookupGetter__< /a> и __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)

Новый способ

Текущий стандартный способ создать динамический метод доступа или мутатор — использовать Object.defineProperty или Object.defineProperties< /а>.

Доступ к функциям доступа и изменения можно выполнить с помощью Object.getOwnPropertyDescriptor< /a> и 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)

Классы ES6

Обратите внимание, что Object.getOwnPropertyDescriptor работает даже при использовании ключевых слов get и set, однако есть пара ошибок, если вы используете ключевое слово 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)

person zzzzBov    schedule 27.01.2011

На самом деле методы __lookupGetter__ и __lookupSetter__ устарели. Вместо них вы должны использовать:

/* __lookupGetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').get;

/* __lookupSetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').set;
person alexpods    schedule 22.12.2014

Взгляните на lookupGetter.

person Ken Redler    schedule 27.01.2011

В Google Chrome lookupGetter/lookupSetter не работает: http://code.google.com/p/chromium/issues/detail?id=13175

person sw.    schedule 31.01.2012