Mootools代码说明

时间:2012-06-08 20:23:54

标签: javascript mootools

我正在尝试通过阅读源代码来学习Mootools,但我不明白为什么它会生成函数的本地副本:

var Function = this.Function;

但是为什么它不会使Array,Number和String的本地副本做同样的事情,例如它们首先出现直接分配给,所以为什么要区别对待Function?

Function.from = function(item){
    return (typeOf(item) == 'function') ? item : function(){
        return item;
    };
};

Array.from = function(item){
    if (item == null) return [];
    return (Type.isEnumerable(item) && typeof item != 'string') ? (typeOf(item) == 'array') ? item : slice.call(item) : [item];
};

Number.from = function(item){
    var number = parseFloat(item);
    return isFinite(number) ? number : null;
};

String.from = function(item){
    return item + '';
};

另外我不明白第149行函数如何调用存储在其本地原型属性上的实现函数?

Function.implement({

hide: function(){
    this.$hidden = true;
    return this;
},

protect: function(){
    this.$protected = true;
    return this;
}

});

是因为Function是一个函数,所以它的内部[[prototype]]是Function.prototype?

1 个答案:

答案 0 :(得分:2)

  • 您会注意到Function的引用比其他构造函数更多,因此它们可能会添加本地引用以获得微小的性能提升,以及压缩,因为本地变量可以被混淆了。 ... (再看看,我确实看到了对其他构造函数的更多引用,而不是我原来的。)

  • 您还会注意到链接到.overloadSetter()函数的Function.prototype.extend用一堆额外代码,鸭子打字等包装该函数。因此,他们没有使用它的原因可能是这些额外的代码显然不需要/不需要内部使用。

  • 因为implement扩展了原型,所以并不总是可取的。有时您只是不希望在所有实例上都有额外的方法,但您确实希望将它们存储在逻辑命名空间中,就像存储在Object构造函数上的本机方法一样。