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

2023-12-23

我正在浏览 MooTools 源代码来尝试理解它.implement() and .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, 和...一起overloadGetter,是两个函数装饰器方法。这overloadSetter函数用于转换具有签名的函数fn(key, value)可以接受对象参数的函数,即:fn({key: value}).

为此,overloadSetter必须包装原始函数。该包装函数具有签名fn(a, b)这是一个快捷方式fn(key, value)。这实际上成为原始函数的新重载版本。

这个重载函数所做的第一件事是检查是否传递了key争论 (a) 是否为字符串类型。如果它不是字符串,则该函数假定我们正在传递一个对象。因此它会迭代对象中的每个键值对并将原始函数应用于它。另一方面,如果它是一个字符串,它只是将函数应用于a and b论据。

Example

为了说明这一点,假设我们有以下函数:

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

var fnOver = fnOrig.overloadSetter();

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

在第一次调用中,fnOver使用两个参数(一个键和一个值)调用函数。当函数检查类型时a参数值,它会看到它是一个字符串。因此,它只会调用原始的fnOrig功能:fnOrig.call(this, 'fruit', 'banana')。我们的控制台输出是'fruit: banana'.

对于第二次调用,fnOver使用对象参数调用函数。由于我们传递的是一个对象而不是字符串,fnOver将迭代该对象的成员并调用fnOrig为它们中的每一个函数。因此,fnOrig在这种情况下将被调用两次:fnOrig.call(this, 'fruit', 'banana') and fnOrig.call(this, 'vegetable', 'carrot')。我们的控制台输出是'fruit: banana' and 'vegetable: carrot'.

Extras

在包装函数内部,您会看到对以下值进行了检查usePlural。这是一个论证overloadSetter方法本身。如果将此值设置为true,新函数会将所有参数视为对象。这意味着即使您传递字符串键参数,它仍然会被作为对象处理。

另一件事是,enumerables实际方法声明之前的代码是否存在,因为它修复了某些浏览器的问题,其中本机Object方法中没有列举for/in即使对象本身实现了它自己的版本,也会循环。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MooTools 的 Function.prototype.overloadSetter() 是做什么的? 的相关文章

随机推荐