mootools docs表示“Extends属性应该是类定义中的第一个属性。”。经过几个小时的调查后,我在mootools doc中偶然发现了这一行。
虽然我的原始问题可以在设置扩展后作为第一个属性解决,但我不明白为什么。
根据js docs,对象中属性的顺序是引擎实现的主题。对订单不作任何保证。
那么为什么mootools依赖订单呢?试图阅读mootools代码并没有帮助我;)。
答案 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
- Extends
和Implements
- 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,而不是僵硬和非干糖
特别是,当Implements
在Extends
之前,事情将会中断,因为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无论如何。