使用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()
的优势和用例是什么?
答案 0 :(得分:4)
主要是可用性。
ES5-compatible browsers中提供了 Object.create()
,而_.defaults()
将在较旧的基于ES3的浏览器(IE8,IE7等)中运行。
也适用于您没有create()
的对象。
如果对象已经存在,那么您无法指望能够在事后更改其[[Prototype]]
来建立欲望继承。
在某些浏览器中可以使用not standard。
使用多个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()
使用原型链继承缺失的内容。因此,使用哪种方式主要取决于您和您的个人偏好。
答案 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