为什么Extends必须是mootools类定义中的第一个属性?

时间:2013-10-15 20:34:46

标签: javascript mootools

mootools docs表示“Extends属性应该是类定义中的第一个属性。”。经过几个小时的调查后,我在mootools doc中偶然发现了这一行。

虽然我的原始问题可以在设置扩展后作为第一个属性解决,但我不明白为什么。

根据js docs,对象中属性的顺序是引擎实现的主题。对订单不作任何保证。

那么为什么mootools依赖订单呢?试图阅读mootools代码并没有帮助我;)。

1 个答案:

答案 0 :(得分:5)

首先,要理解这一点:MooTools类构造函数接受传递给它的简单对象,然后循环遍历属性

让我们从implement开始 - https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L75 - 正在调用传递给Class构造函数的所有属性。这是一个重载函数 - 请参阅https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L98 - 它允许它使用密钥对象 - >价值对。 overloadSetter使用标准for (var key in obj)循环,在大多数实现中都是FIFO - 忽略webkit奇怪的倾向,即对键进行排序并返回具有数字索引或首先以数字字符开头的键。 ECMA规范不保证属性的顺序

在循环遍历对象属性时,它会尝试查看Class.Mutators - ExtendsImplements - https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L100-L113

下定义的变更器

对于extends,它将设置parent属性并设置新对象构造函数的原型 - https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L103-L104 - 这需要尽早发生。 它并没有专门提取Extends / Implements,因为它是为了扩展而构建的,并允许您添加自己的自定义Mutators,例如。 MooTools中的Binds - 更多 - 也许不是唯一的解决方案,但有些东西最好留作笨拙但灵活的API,而不是僵硬和非干糖

特别是,当ImplementsExtends之前,事情将会中断,因为Implements实际上是......没关系 - 我已经在很久以前的博客文章中描述了这一点遇到了它 - 但是与一些MooTools的核心开发者交谈,很明显为什么。看看我必须经历的内容:http://fragged.org/mootools-pattern-fun-class-implements-extends-at-the-same-time_1359.html

可以说,现在已经不复存在的mootools-2.0 AMD分支在这里做得更好 - https://github.com/kamicane/mootools-core/blob/define-2/Source/Core/Class.js#L19

所以 - 现在,我们需要忍受它 - 直到Prime无论如何。