天哪,最近的问题似乎更多地集中在 mootools 内部。
我将尽我所知回答,因为我不是核心开发人员。
Type
MooTools 中的类与 Class 非常相似(事实上,类构造函数本身就是一个类型 https://github.com/mootools/mootools-core/blob/master/Source/Class/Class.js#L19)但它更关注数据/值和值的类型。它还旨在扩展 ECMA 规范定义的本机类型并使它们更加灵活。
我想一般讨论数据类型是没有意义的(String
, Number
, Array
, Object
, ETC)。为什么需要延长它们?好吧,对于初学者来说,管道类型在 js 中有点古怪。typeof {}; // object
, typeof []; // object
, typeof new Date(); // object
等等 - 不是最有帮助的,即使因为所有类型都继承自 object 并且将它们组合在一起是合乎逻辑的,但它不会帮助您编写代码。
因此,在 js 对象的上下文中,它们是从构造函数对象创建的......
Type 所做的并不是替换构造函数,而是通过向现有构造函数添加新方法或属性来更改现有构造函数。
eg. new Type('Array', Array);
这会将本机 Array 构造函数转换为某种类型对象。您不需要保存结果或任何内容 - 这是一个一次性操作,可以修改原始结果并使其开放以供操作。
typeOf(Array); // type
那么,有什么不同呢?嗯,对于初学者来说,typeOf([])
现在能够真正告诉我们它到底是什么 -array
。这里真正发生的事情是这样的:object.extend(Type);
,神奇的一点。它将把 Type 对象上定义的所有属性复制到目标对象 - 您可以在这里看到它们:
https://github.com/mootools/mootools-core/blob/master/Source/Core/Core.js#L211-232 https://github.com/mootools/mootools-core/blob/master/Source/Core/Core.js#L211-232
因此,您新创建的类型立即获得所有重要的信息implement
and extend
方法。
更高级的是,让我们创建一个基于本机 Array 构造函数的新类型:
var foo = new Type('foo', Array),
a = new foo();
// it's a real boy!
a.push('hi');
// ['hi'], foo, object
console.log(a, typeOf(a), typeof a);
但是,如果我们想要自定义类型怎么办?一个神奇而特别的东西?没问题,因为参数 2 实际上可以是一个(匿名)函数。
var Awesome = new Type('awesome', function(name, surname) {
// console.log('I R teh construct0r!');
this.name = name;
this.surname = surname;
});
// extend it a little.
Awesome.implement({
getName: function() {
return this.name;
},
getSurname: function() {
return this.surname;
}
});
var Dimitar = new Awesome('dimitar', 'christoff');
console.log(typeOf(Dimitar)); // awesome
console.log(Dimitar.getName()); // dimitar
在另一个例子中,看看 DOMEvent。它采用上述内容并将其变成更快、更精简的对象类型。https://github.com/mootools/mootools-core/blob/master/Source/Types/DOMEvent.js#L21 https://github.com/mootools/mootools-core/blob/master/Source/Types/DOMEvent.js#L21
那么为什么这不是一个类呢?因为,课程更贵,而且活动一直在发生。
我希望这对您有所帮助。要获得更详细的解释,请在邮件列表上询问并希望得到最好的结果,也许核心开发人员会有时间,因为这不是标准的“我如何让手风琴工作”类型的问题......