为什么更喜欢defaults()而不是Javascript原型

Why prefer defaults() over Javascript prototyping?

本文关键字:Javascript 原型 更喜欢 defaults 为什么      更新时间:2023-09-26

使用Undercore.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";

js的defaults()有什么优势和用例?

  1. 大部分可用。

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

  2. 也适用于未create()的对象。

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

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

  3. 使用多个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()使用原型链来继承缺失的内容

所以,使用哪一种在很大程度上取决于你和你的个人喜好。

除了使用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;
  };

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