2013-08-02 40 views
1

使用Underscore.js,我們可以使用defaults()將默認值應用於對象。爲什麼比JavaScript原型更喜歡默認值()?

var defaultProperties = { flavor : "vanilla", sprinkles : "lots" }; 
var iceCream = {flavor : "chocolate"}; 
_.defaults(iceCream, defaultProperties); 

但是在Javascript中,默認值也可以通過使用原型來實現。

var defaultProperties = { flavor : "vanilla", sprinkles : "lots" }; 
var iceCream = Object.create(defaultProperties); 
iceCream.flavor = "chocolate"; 

什麼是Underscore.js' defaults()的優勢和使用情況?

回答

4
  1. 大多數可用性。

    Object.create()可在ES5-compatible browsers中使用,而_.defaults()可用於基於ES3的舊版瀏覽器(IE8,IE7等)。

  2. 此外,對於你沒有create()的物體。

    如果對象已經存在,則不能指望能夠通過事後修改其[[Prototype]]來建立慾望繼承。

    這可能在某些瀏覽器中,但not standard

  3. 使用多於1 defaults對象可能會使事情變得更容易。

    _.defaults(options, config, defaults); 
    

    這是可能的原型鏈,但你必須建立一個。

    var defaults = { /* ... */ }; 
    
    var config = Object.create(defaults); 
    config.mixed = true; 
    
    var iceCream = Object.create(config); 
    iceCream.flavor = 'chocolate'; 
    

但是,在一般情況下,它們各自有類似的目的。他們只是從不同的角度這樣做:

  • _.default()迭代找到並設置缺少的東西。
  • Object.create()使用原型鏈繼承缺少了什麼。

因此,要使用在很大程度上取決於你和你的個人喜好。

+0

謝謝。還有一件事讓我想起了最後一段。由'defaults()'填充的對象可能會更快地打勾,因爲稍後訪問它們的屬性不需要遍歷原型鏈。 – danijar

2

除了使用Underscore的默認功能,您無需編寫額外的代碼來驗證和分配一組屬性到所需的對象,就完全沒有區別。通過將它抽象爲單個函數,您的代碼看起來會更有意義,更整齊。這使它成爲一個方便的實用功能。

這裏是下劃線的默認功能

// Fill in a given object with default properties. 
    _.defaults = function(obj) { 
    each(slice.call(arguments, 1), function(source) { 
     if (source) { 
     for (var prop in source) { 
      if (obj[prop] === void 0) obj[prop] = source[prop]; 
     } 
     } 
    }); 
    return obj; 
    }; 

它需要的對象,並設定值作爲參數的來源,通過設置化子性質的循環,如果屬性不已經在該對象存在,分配它對它。來源:UnderscoreJS code on Github

相關問題