2014-03-14 52 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鍵」*坦率地說,我會打電話給那些非常可疑的建議。 :-) –