Автоматические геттеры / сеттеры - PullRequest
0 голосов
/ 08 марта 2012

Я использую mootools 1.4.3 для базового наследования классов. Я на самом деле конвертирую некоторый код из другой библиотеки классов. Эта другая библиотека классов будет динамически создавать методы получения и установки на основе предварительно определенного шаблона имени функции (функция-член _ get _xxx выдаст получатель для xxx). Я хотел сделать что-то подобное с MooTools. Я не новичок в Javascript, но я немного незнаком с более продвинутыми концепциями.

Я заставил его работать частично. В коде, где определяется объект Class, я перебираю параметры классов и добавляю defineGetter или defineSetter соответственно.

http://jsfiddle.net/Qa2dr/1/

Это прекрасно работает и создает правильные методы получения и установки. Где это терпит неудачу, - то, когда я создаю дочерний класс. Эти динамические методы получения / установки не распространяются на дочерний класс. Я не уверен, возможно ли это, и если да, то как это делается. Используя вышеупомянутое изменение к классу mootools и этим классам:

http://jsfiddle.net/vLyk7/10/

В журнале для foo я вижу геттер и сеттер для bar. В журнале для baz я вижу getter и setter для quux, но я также хотел бы видеть getter и setter от родителя. Опять же, если я смогу заставить это работать, это сэкономит мне много времени при преобразовании этого кода.

1 Ответ

0 голосов
/ 08 марта 2012

правый. Я думаю, я понимаю, что вы пытаетесь сделать, но ...

__defineGetter__ и __defineSetter__ устарели и не пересекаются с браузером: https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/DefineSetter

Защита и проксирование прямого доступа к этим свойствам не будут работать, когда вы расширяете объект, потому что установщик / получатель - обращаясь к свойствам нового объекта - не перейдет к родительскому объекту (объекту-прототипу), где вы слушаете.

Вы можете попробовать посмотреть на Extends параметр. когда вы устанавливаете новый класс, ищите функции, присутствующие на всем пути вверх по цепочке прототипов от нового объекта params, и если совпадение найдено, вы должны также применить установщик / получатель к новому объекту. это не так просто ...

Я бы сказал, вероятно, после: newClass.prototype.parent = parent; Вы сможете проверить, стали ли доступны геттеры / сеттеры, и присоединить своих слушателей. вы, вероятно, хотите как-то сохранить ссылку, если не хотите проверять все свойства класса на этом этапе.

в качестве альтернативы, вы можете реорганизовать мутатор класса инициализации без перехода к созданию типа и добавить туда свои вещи - хотя оригинальный объект может быть недоступен.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...