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

Why must Extends be the first property in a mootools class definition?

本文关键字:定义 第一个 属性 mootools 扩展 为什么      更新时间:2023-09-26

mootools 文档指出"扩展属性应该是类定义中的第一个属性。经过几个小时的调查,我在mootools文档中偶然发现了这一行。

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

根据 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 - 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,因为它被构建为可扩展并允许您添加自己的自定义突变器,例如。 Binds MooTools-more - 也许不是唯一的解决方案,但有些东西最好保留为笨拙但灵活的API,而不是刚性和非DRY糖。

特别是,当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无论如何都出来。