javascript – MooTools的Function.prototype.overloadSetter()做什么?

我正在浏览MooTools源码来尝试了解它的.implement()和.extend()实用程序。

每个的定义是指定义如下的函数:

var enumerables = true;
for (var i in {toString: 1}) enumerables = null;
if (enumerables) enumerables = ['hasOwnProperty', 'valueOf', 'isPrototypeOf', 'propertyIsEnumerable', 'toLocaleString', 'toString', 'constructor'];

Function.prototype.overloadSetter = function(usePlural){
    var self = this;
    return function(a, b){
        if (a == null) return this;
        if (usePlural || typeof a != 'string'){
            for (var k in a) self.call(this, k, a[k]);
            if (enumerables) for (var i = enumerables.length; i--;){
                k = enumerables[i];
                if (a.hasOwnProperty(k)) self.call(this, k, a[k]);
            }
        } else {
            self.call(this, a, b);
        }
        return this;
    };
};

但是,我很难理解它的作用。

你能解释这个功能如何工作,它有什么作用?

overloadSetter

overloadSetter和overloadGetter一起是两个函数装饰器方法。 overloadSetter函数用于将具有签名fn(key,value)的函数转换为可以接受对象参数的函数,即:fn({key:value})。

为了做到这一点,overloadSetter必须包装原来的功能。这个包装函数具有签名fn(a,b),它是fn(key,value)的快捷方式。这有效地成为原来功能的新的重载版本。

首先这个重载函数的作用是检查传递的关键参数(a)是否是字符串类型。如果它不是字符串,则该函数假定我们传递一个对象。因此,它迭代对象中的每个键值对,并将原始函数应用于对象。另一方面,如果它是一个字符串,它只是将函数应用于a和b参数的值。

为了说明,假设我们有以下功能:

var fnOrig = function(key, value){
    console.log(key + ': ' + value); 
};

var fnOver = fnOrig.overloadSetter();

fnOver('fruit', 'banana');
fnOver({'fruit': 'banana', 'vegetable': 'carrot'});

在第一次调用中,fnOver函数使用两个参数(一个键和一个值)进行调用。当函数检查参数值的类型时,它会看到它是一个字符串。因此,它将简单地调用原始的fnOrig函数:fnOrig.call(this,’fruit’,’banana’)。我们的控制台输出是“水果:香蕉”。

对于第二次调用,使用对象参数调用fnOver函数。由于我们传递一个对象而不是一个字符串,所以fnOver将遍历该对象的成员,并为每个对象调用fnOrig函数。因此,在这种情况下,fnOrig将被调用两次:fnOrig.call(this,’fruit’,’banana’)和fnOrig.call(这是’vegetable’,’carrot’)。我们的控制台输出是“水果:香蕉”和“蔬菜:胡萝卜”。

附加功能

在包装器功能中,您将看到有一个检查usePlural的值。这是overloadSetter方法本身的一个参数。如果将此值设置为true,则新函数将将所有参数视为对象。这意味着即使您传递一个字符串键参数,它仍将被处理为一个对象。

另一方面,枚举实际方法声明的枚举代码是存在的,因为它修复了某些浏览器的问题,其中本机对象方法不会枚举在/ in循环中,即使对象本身也实现了自己的版本。

翻译自:https://stackoverflow.com/questions/4006516/what-does-mootools-function-prototype-overloadsetter-do

转载注明原文:javascript – MooTools的Function.prototype.overloadSetter()做什么?