Javascript mootools类型函数

Javascript mootools类型函数,javascript,object,constructor,mootools,Javascript,Object,Constructor,Mootools,所以我试图通过学习Mootools如何在内部工作来学习javascript。我特别关注以下几行: var Type = this.Type = function(name, object){ if (name){ var lower = name.toLowerCase(); var typeCheck = function(item){ return (typeOf(item) == lower); };

所以我试图通过学习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语句调用它作为构造函数


具体来说,线条对象中的“this”是什么?扩展(this)?它是全局窗口对象吗?如果是,它是将该对象的所有键、值对添加到类型对象吗?

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

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

MooTools中的
Type
与类(实际上是)非常相似,但它更关注数据/值和值的类型。它还意味着扩展ECMA规范定义的本机类型,使它们更加灵活

我想在一般情况下谈论数据类型是没有意义的(
String
Number
Array
Object
,等等)。为什么需要扩展它们?首先,管道类型在js中有点古怪<代码>类型{};//对象,
类型[];//对象
新日期的类型();//object
etc-这不是最有用的,即使因为所有类型都继承自object,并且按逻辑将它们分组在一起,它也不会帮助您编写代码

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

类型不是替换构造函数函数,而是通过向现有构造函数添加新方法或属性来更改现有构造函数

例如,
新类型('Array',Array)

这将把本机数组构造函数转换为排序的类型对象。您不需要保存结果或任何东西-这是一个一次性操作,修改原始文件,并将其打开以供操作

typeOf(数组);//类型

那么,有什么不同呢?首先,
typeOf([])
现在可以告诉我们它到底是什么-
array
。这里真正发生的是:
object.extend(Type),神奇的一位。它会将类型对象上定义的所有属性复制到目标对象-您可以在此处看到它们:

因此,新创建的类型立即获得所有重要的
implement
extend
方法

更高级的是,让我们创建一个基于本机数组构造函数的新类型:

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。它采用了上述方法,使其成为一种更快、更精简的对象类型

那为什么这不是一门课呢?因为,课程更昂贵,事件总是发生


我希望这对你有所帮助。要获得更详细的解释,请在邮件列表中询问,并希望得到最好的结果,也许核心开发人员会有时间,因为这不是您标准的“如何让手风琴工作”类型的问题

请参阅本文,了解使用类型向类型添加断言的一种富有想象力的方法。谢谢你的精彩回答,我想了解核心模块,这样我就可以更好地理解JS以及MooTools库的其他部分。在这方面你帮了我很多。我可以问一下为什么是Type('Type',Type);如果只是更新类型函数,是否需要使用new调用?没有新的就不能叫它。哦。。。那不是一个快速的话题。基本上。对象构造函数在实例化时需要
new
,这将函数中的作用域设置为新的宿主对象本身。否则,
this
将保留为全局对象(例如,窗口),因此对
this.$events
等属性的引用将查找
window.$events
。在这里阅读更多关于作用域/构造函数的内容-。试试看-
var foo=function(){this.bar='hello';};var ret=new foo();控制台日志(ret、window.bar);foo();console.log(window.bar)