3

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

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 吗?

4

1 回答 1

2
  • 您会注意到它Function比其他构造函数被更多地引用,因此它们可能添加了局部引用以实现微小的性能提升,以及压缩,因为局部变量可以被混淆。... (再看一遍,我确实看到对其他构造函数的引用比我最初看到的要多。)

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

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

于 2012-06-08T21:02:18.757 回答