2012-03-08 64 views
0

我正在使用mootools 1.4.3进行基本类继承。我实际上是从一个不同的类库转换一些代码。这个其他类库会根据预定义的函数名称模板动态创建getter和setter(成员函数_ 得到 _xxx将产生xxx的getter)。我想要做一些与mootools类似的东西。我对JavaScript并不陌生,但我对某些更高级的概念有些陌生。自动获取/设置器

我已经完成了它的部分工作。在正在定义Class对象的代码中,循环遍历类参数并相应地添加defineGetterdefineSetter

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

这个伟大的工程,它创造的getter和setter方法正确。失败的地方是我创建一个孩子班的时候。这些动态获取器/设置器不会传播到子类。我不确定这是否可能,如果是的话,它是如何做到的。使用上述变化MooTools的类和这些类:

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

在日志中富,我可以看到酒吧的getter和setter。在baz的日志中,我可以看到quux的getter和setter,但我也想看到来自父级的getter和setter。再说一次,如果我能够实现这一点,它将为我节省很多时间来转换此代码。

+1

你能解释一下你的用例吗?有什么可能的好处是没有创建 - 自动 - 你的原型映射到特定属性的函数?可能Class.Mutators是去这里的地方,你可以声明哪些变量应该接收一个getter/setter。 – 2012-03-08 16:21:18

+0

基本上,我正在使用一些现有的代码,它具有__get__XXX和__set__XXX类型的函数,而不是在每个构造函数中添加__defineGetter__和__defineSetter__,我想改变MooTools为我创建这些代码。我的尝试有点奏效,但生成的基类getter/setters不可用于子类。 – brandon 2012-03-08 16:30:33

回答

0

对。我觉得我得到你正在尝试做的,但...

__defineGetter____defineSetter__已过时,不能跨浏览器:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/DefineSetter

保护和代理到这些属性的直接访问,当你扩展对象将无法正常工作因为setter/getter(访问新对象上的属性)不会转到您正在侦听的父级(原型对象)。

你可以试试看Extends param。当你设置新的类时,从新的params对象中查找原型链中存在的函数,如果找到了匹配项,则应该将setter/getter也应用于新对象。这不是那么容易...

我想说,大概在:newClass.prototype.parent = parent;你应该能够检查getter/setters是否已经变得可用并附加你的监听器。您可能想要以某种方式保存参考,除非您想在此处检查所有类属性。

或者,您可以重构初始化类mutator w/o进入类型创建并追加你的东西 - 尽管原始对象可能不可用。