代码之家  ›  专栏  ›  技术社区  ›  Austin Hyde

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

  •  15
  • Austin Hyde  · 技术社区  · 15 年前

    .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;
        };
    };
    

    你能解释一下这个函数是怎么工作的吗?

    2 回复  |  直到 15 年前
        1
  •  29
  •   Mark Keeto Obcena    15 年前

    重载设置器

    overloadSetter overloadGetter ,是两个函数decorator方法。这个 重载设置器 fn(key, value) 到可以接受对象参数的函数,即: fn({key: value}) .

    为了做到这一点, 重载设置器 fn(a, b) 这是一条捷径 fn(键,值) . 这实际上成为原始函数的新重载版本。

    key 论据( 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') . 我们的控制台输出是 'fruit: banana' .

    弗诺弗 函数是用对象参数调用的。因为我们传递的是对象而不是字符串, 弗诺弗 将遍历此对象的成员并调用 fnOrig公司 对他们每个人都起作用。因此, fnOrig公司 在这种情况下将调用两次: fnOrig.call(this, 'vegetable', 'carrot') . 我们的控制台输出是 '水果:香蕉' 'vegetable: carrot'

    额外费用

    在wrapper函数中,您将看到有一个检查 usePlural . 这是一个关于 重载设置器 方法本身。如果将此值设置为 true

    另一件事是 enumerables 是不是因为它修复了一些浏览器的问题,其中 Object for/in 循环,即使对象本身实现了它自己的版本。

        2
  •  3
  •   LHMathies    14 年前

    有段时间让我挠头的是

    var enumerables = true; for (var i in {toString: 1}) enumerables = null;

    enumerables null ,但是有了DontEnum虫 toString 被抑制(错误地,因为对象 prototype.toString 拥有 DontEnum 可枚举 true .

    overloadSetter (或者更确切地说是结果函数)然后必须一次检查一个DontEnum错误影响的七个属性,看看它们是否存在于对象参数中。