mootools docs 声明“Extends 属性应该是类定义中的第一个属性。”。经过数小时的调查,我在 mootools 文档中偶然发现了这一行。
虽然我原来的问题可以在设置 Extends 作为第一个属性后解决,但我不明白为什么。
根据 js 文档,对象中属性的顺序是引擎实现的主题。对订单不做任何形式的保证。
那么mootools为什么要依赖顺序呢?尝试阅读 mootools 代码对我没有帮助;)。
最佳答案
首先,理解这一点: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 下定义的修改器
在扩展的情况下,它将设置 parent
属性并设置新对象构造函数的原型(prototype) - https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L103-L104 - 这需要尽早发生。它没有专门提取 Extends
/Implements
因为它被构建为可扩展的并允许您添加自己的自定义 Mutator,例如。 MooTools-more 中的 Binds
- 也许不是唯一的解决方案,但有些东西最好保留为笨拙但灵活的 API,而不是刚性和非 DRY 糖
特别是,当 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 出局。
关于javascript - 为什么扩展必须是 mootools 类定义中的第一个属性?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19390537/