重载设置器
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
即使对象本身实现了它自己的版本,也会循环。