为什么更喜欢默认值()而不是Javascript原型?

时间:2013-08-02 07:13:58

标签: javascript object underscore.js default-value prototyping

使用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()的优势和用例是什么?

2 个答案:

答案 0 :(得分:4)

  1. 主要是可用性。

    ES5-compatible browsers中提供了

    Object.create(),而_.defaults()将在较旧的基于ES3的浏览器(IE8,IE7等)中运行。

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

    如果对象已经存在,那么您无法指望能够在事后更改其[[Prototype]]来建立欲望继承。

    在某些浏览器中可以使用not standard

  3. 使用多个defaults对象可能会让事情变得更轻松。

    _.defaults(options, config, defaults);
    

    这可以使用原型链,但您必须建立一个。

    var defaults = { /* ... */ };
    
    var config = Object.create(defaults);
    config.mixed = true;
    
    var iceCream = Object.create(config);
    iceCream.flavor = 'chocolate';
    
  4. 但是,一般来说,它们的用途非常相似。他们只是从不同的角度这样做:

    • _.default()迭代查找并设置缺少的内容。
    • Object.create()使用原型链继承缺失的内容。

    因此,使用哪种方式主要取决于您和您的个人偏好。

答案 1 :(得分:2)

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

以下是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