4

mootools 文档声明“Extends 属性应该是类定义中的第一个属性。” 。经过数小时的调查,我偶然发现了 mootools 文档中的这一行。

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

根据 js 文档,对象中属性的顺序是引擎实现的主题。对订单不做任何形式的保证。

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

4

1 回答 1

5

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

让我们从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

在扩展的情况下,它将设置parent属性并设置新对象构造函数的原型 - https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L103- L104 - 这需要尽早发生。它没有专门采摘Extends/Implements因为它被构建为可扩展并允许您添加自己的自定义 Mutators,例如。Binds在 MooTools-more - 也许不是唯一的解决方案,但有些东西最好保留为笨拙但灵活的 API,而不是刚性和非 DRY 糖

特别是,事情会在Implements以前发生ExtendsImplements实际上会发生......没关系 - 我在很久以前第一次遇到它时在一篇博客文章中描述了这一点 - 但与一些 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 出来为止。

于 2013-10-15T21:11:43.273 回答