1

使用 Underscore.js,我们可以defaults()将默认值应用于对象。

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

2 回答 2

4
  1. 主要是可用性。

    Object.create()在兼容 ES5 的浏览器中可用,而_.defaults()在旧的基于 ES3 的浏览器(IE8、IE7 等)中也可以使用。

  2. 也适用于你没有的对象create()

    如果对象已经存在,则不能指望能够在[[Prototype]]事后更改其以建立欲望继承。

    在某些浏览器中是可能的,但不是标准的。

  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()使用原型链来继承缺失的东西。

因此,使用哪个在很大程度上取决于您和您的个人喜好。

于 2013-08-02T07:45:25.910 回答
2

除了使用 Underscore 的默认函数可以让您免于编写额外的代码来验证和分配一组属性到所需的对象之外,这绝对没有区别。通过将其抽象为单个函数,您的代码看起来会更有意义和整洁。这使它成为一个方便的实用功能。

下面是 Underscore 的 defaults 函数的来源

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

它将对象和值集作为参数,循环遍历属性集,如果该对象中尚不存在该属性,则将其分配给它。来源:Github 上的 UnderscoreJS 代码

于 2013-08-02T07:21:47.717 回答