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

Mar*_*sch 4 javascript mootools

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

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

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

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

Dim*_*off 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下定义的mutators

在extends的情况下,它将设置parent属性并设置新对象构造函数的原型 - https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L103- L104 - 这需要在早期发生.它没有专门采摘Extends/ Implements因为它是可扩展的,并允许您添加自己的自定义Mutators,例如.Binds在MooTools中 - 或许不是唯一的解决方案,但有些东西最好留下笨拙但灵活的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无论如何.