Получить функцию Getter в Javascript - PullRequest
14 голосов
/ 28 января 2011

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

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

Но есть ли способ получить функцию получения или установки?Я думаю о чем-то вроде этого:

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

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

Ответы [ 4 ]

17 голосов
/ 22 декабря 2014

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

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

/* __lookupSetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').set;
11 голосов
/ 28 января 2011

по-старому

__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)

Новый путь

Текущий стандартный способ создания динамического метода доступа или мутатора - использовать 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) 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)

2 голосов
/ 28 января 2011

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

1 голос
/ 01 февраля 2012

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

...