我正在尝试通过阅读源代码来学习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?
答案 0 :(得分:2)
您会注意到Function
的引用比其他构造函数更多,因此它们可能会添加本地引用以获得微小的性能提升,以及压缩,因为本地变量可以被混淆了。 ... (再看看,我确实看到了对其他构造函数的更多引用,而不是我原来的。)
您还会注意到链接到.overloadSetter()
函数的Function.prototype.extend
用一堆额外代码,鸭子打字等包装该函数。因此,他们没有使用它的原因可能是这些额外的代码显然不需要/不需要内部使用。
因为implement
扩展了原型,所以并不总是可取的。有时您只是不希望在所有实例上都有额外的方法,但您确实希望将它们存储在逻辑命名空间中,就像存储在Object
构造函数上的本机方法一样。