gpt4 book ai didi

javascript - mootools 类型函数

转载 作者:行者123 更新时间:2023-11-29 10:50:34 26 4
gpt4 key购买 nike

所以我试图通过了解 Mootools 的内部工作原理来学习 javascript。我正在专门查看这些行:

var Type = this.Type = function(name, object){
if (name){
var lower = name.toLowerCase();
var typeCheck = function(item){
return (typeOf(item) == lower);
};

Type['is' + name] = typeCheck;
if (object != null){
object.prototype.$family = (function(){
return lower;
}).hide();

}
}

if (object == null) return null;

object.extend(this);
object.$constructor = Type;
object.prototype.$constructor = object;

return object;
};

//some more code

new Type('Type',Type);

这里发生了什么?

在底部的构造函数语句中分配给全局窗口对象的对象是什么?

当 Type 函数似乎只更新传入的对象而不是创建新对象时,为什么它被调用为带有 new 语句的构造函数?

特别是 object.extend(this); 行中的“this”是什么? ?它是全局窗口对象,如果是,它是否将该对象的所有键、值对添加到 Type 对象?

最佳答案

天哪,最近的问题似乎更多地集中在 mootools 内部。

我将尽我所知回答,因为我不是核心开发人员。

MooTools 中的

Type 与 Class(实际上是 Class constructor itself is a Type)非常相似,但它更侧重于数据/值和值的类型。它还旨在扩展 ECMA 规范定义的原生类型并使它们更加灵活。

我想讨论一般的数据类型没有意义(StringNumberArrayObject等)。为什么需要扩展它们?好吧,对于初学者来说,Duct Typing 在 js 中有点古怪。 类型{};//对象, typeof [];//对象, typeof new Date();//object 等 - 不是最有帮助的,即使因为所有类型都继承自 object 并且将它们组合在一起是合乎逻辑的,它不会帮助您编写代码。

因此,在 js 对象的上下文中,它们是从构造函数对象创建的...

Type 所做的不是替换构造函数,而是通过向其添加新方法或属性来更改现有构造函数。

例如。 new Type('Array', Array);

这会将 native Array 构造函数变成某种类型的对象。您不需要保存结果或任何东西 - 这是一种一次性操作,可以修改原始数据并使其保持打开状态以供操作。

typeOf(数组);//类型

那么,有什么不同呢?好吧,对于初学者来说,typeOf([]) 现在能够真正告诉我们它到底是什么 - array。这里真正发生的是:object.extend(Type);,神奇的一点。它会将 Type 对象上定义的所有属性复制到目标对象 - 你可以在这里看到它们:

https://github.com/mootools/mootools-core/blob/master/Source/Core/Core.js#L211-232

因此,您新创建的 Type 会立即获得所有重要的 implementextend 方法。

更高级的是,让我们创建一个基于原生 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

那为什么那不是一个类呢?因为,类(class)更贵,而且事件一直在发生。

希望对您有所帮助。如需更详细的解释,请在邮件列表上询问并希望最好,也许核心开发人员会有时间,因为这不是您的标准“我如何让 Accordion 工作”类型的问题......

关于javascript - mootools 类型函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987173/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com