2014-03-14 53 views
1

好的。所以,到现在为止我已经使用像这样的事情“侥幸”对象的适当属性循环

function foo(arg) { 
    // Default values: 
    var opt = { a: 1, b: 2, c: 3 }, 
     key; 
    for (key in opt) 
     if (opt.hasOwnProperty(key) && arg.hasOwnProperty(key)) 
      opt[key] = arg[key]; 
} 

现在,我越来越撞坏使用hasOwnProperty,因为它可能已经被一些自定义属性覆盖。

如果我们要使用keys()forEach()等代替的是做这样的事情上面的正确方法?像这样?

function bar(arg) { 
    // Default values: 
    var opt = { a: 1, b: 2, c: 3 }, 
     keys = Object.keys(arg); 
    Object.keys(opt).forEach(function(key) { 
     if (keys.indexOf(key) !== -1) 
      opt[key] = arg[key]; 
    }); 
} 

回答

2

如果您关于hasOwnProperty已被覆盖,那么你可以做:

Object.prototype.hasOwnProperty.call(arg, key) 

所以你原来的代码可能是:

function foo(arg) { 
    var opt = { a: 1, b: 2, c: 3 }, 
     check = Object.prototype.hasOwnProperty, 
     key; 
    for (key in opt) { 
     if (check.call(opt, key) && check.call(arg, key)) { 
      opt[key] = arg[key]; 
     } 
    } 
    return opt; 
} 
+0

是的,这是一个不错的选择。但是,有些人甚至说我不应该直接在例如*上使用* hasOwnProperty *。内部* opt *就像上面一样。我无法真正理解如下:*当它处于如此短的封闭范围内时,哪里可能被重写*。 – user3342816

+0

@ user3342816'Object.prototype.foo = 1'会影响'opt'。 – xdazz

+0

啊,好的。谢谢。 PS:在第三行输入“;'而不是','在行尾。 – user3342816

1

没有什么不对您的原始代码  —除了令人震惊的缺乏{}! ;-)

如果你觉得你因为某些原因需要使用Object.keysforEach相反,你并不需要得到arg的钥匙,只是opt。这将等于你的第一个代码块,使用Object.keysforEach

function bar(arg) { 
    // Default values: 
    var opt = { a: 1, b: 2, c: 3 }; 
    Object.keys(opt).forEach(function(key) { 
     if (arg.hasOwnProperty(key)) 
      opt[key] = arg[key]; 
    }); 
} 

但是,再次,没有理由去改变它,你的原始代码是好的。

现在,我越来越多地使用hasOwnProperty,因为它可能已被一些自定义属性覆盖。

如果有人重写hasOwnProperty,那么理论上他们有这样做的充分理由。除了一些特殊情况,我不会担心。但是,如果你想避免这一问题,你可以这样做:

var hop = Object.prototype.hasOwnProperty; 
function foo(arg) { 
    // Default values: 
    var opt = { a: 1, b: 2, c: 3 }, 
     key; 
    for (key in opt) 
     if (hop.call(opt, key) && hop.call(arg, key)) 
      opt[key] = arg[key]; 
} 

那么你唯一关心的是是否有人替代Object.prototype.hasOwnProperty;如果他们这样做了,而且他们的替换工作不正常,那么你的循环可能是他们最担心的问题。

+0

是的,我还没有使用的习惯'{} '当下一行只有一个操作时。也许不好。如果我需要改变它是我有点不确定的一点。得到了与上述类似的代码的反馈*较新的使用hasOwnProperty *使用[es5-shim](https://github.com/es-shims/es5-shim)键等我不能说我很舒服无论哪种方式争论。其他包括小型项目的垫片似乎有点矫枉过正。 – user3342816

+1

@ user3342816:*“是的,我有习惯在下一行只有一项操作时使用{}。”*几乎所有你会发现的风格指南都需要使用花括号,因为研究后的研究表明这样做始终减少错误(第一次编写代码以及编辑时)。 *“已经获得了与上述相似的代码的反馈,而较新的使用hasOwnProperty使用es5-shim键”*坦率地说,我会打电话给那些非常可疑的建议。 :-) –