为什么更喜欢defaults()而不是Javascript原型
Why prefer defaults() over Javascript prototyping?
使用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()
有什么优势和用例?
-
大部分可用。
Object.create()
可在兼容ES5的浏览器中使用,而_.defaults()
将在较旧的基于ES3的浏览器(IE8、IE7等)中使用 -
也适用于未
create()
的对象。如果对象已经存在,则不能指望能够在事后更改其
[[Prototype]]
来建立所需的继承。这在某些浏览器中是可能的,但不是标准的。
-
使用多个
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代码
相关文章:
- 使用“;这个“;JavaScript原型方法中的关键字
- Node.js中的JavaScript原型对象效率
- 为什么要返回'这'在导致循环的JavaScript原型中
- JavaScript原型设计基础知识
- 就良好实践而言,带闭包的javascript原型是一件好事吗
- 无法从angularjs调用JavaScript原型函数
- JavaScript原型示例
- Javascript原型组织
- 未复制JavaScript原型
- JavaScript原型的意义到底是什么
- 两个对象之间的Javascript原型
- 使用特权Getter/Setter函数的JavaScript原型函数
- 语法错误,但无法调试JavaScript原型
- 澄清:Javascript原型更新混乱
- 如何进行JavaScript原型继承(原型链)
- Javascript原型通用Enquries和通过数组索引分配Id
- 理解Javascript原型继承
- JavaScript原型与实践中的对比
- JavaScript原型构造函数只调用过一次
- Javascript原型继承原型函数调用