1.用 … 解构设置
在看compressor.js的时候,他用一个文件来存默认值,然后导出,最后用解构的方式,后面的值覆盖前面的方式设置默认值。当然也可以用Object.assign
都是一样的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| export default { maxWidth: Infinity, maxHeight: Infinity, }
import DEFAULTS from './defaults';
export default class Compressor { constructor (option) { this.option = { ...DEFAULTS, ...option, } } }
|
上面的方法看着挺方便的,但是还有缺陷,解决不了下面的问题
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| let user = { a: "a1", b: { c: "c1" } }
let defaults = { a: "a2", b: { c: "c2", d: "d1" }, }
let option = { ...defaults, ...user }
console.log(option)
|
可以看到默认配置中 d丢失了,下面的方法可以解决这个问题
2.extend方法
Mescroll.js实现的方法,适合多个方法都需要默认值的时候,并且可以深度匹配默认值,默认值作为第二个参数传入,
1 2 3 4 5 6 7 8 9 10 11
| MeScroll.extend = function (userOption, defaultOption) { if (!userOption) return defaultOption; for (var key in defaultOption) { if (userOption[key] == null) { userOption[key] = defaultOption[key]; } else if (typeof userOption[key] === 'object') { MeScroll.extend(userOption[key], defaultOption[key]); } } return userOption; }
|
但是有些场景我们是需要有多个配置进行合并,我们可以参考jquery的extend
实现方式
3.$.extend
$.extend([deep,] [target,] object1 [,objectN])
deep: Boolen类型,可选,表示是否进行递归合并(深/浅复制),为true是为深复制;默认值为false,浅复制。
target:扩展对象,可选,将接收新的属性。
objectN:一个对象,包含额外的属性,扩展到目标对象(扩展对象)。
我们可以砍掉一个没必要的功能,就是$.extend
如果参数中只有一个对象,则扩展jquery对象。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| jQuery.extend = jQuery.fn.extend = function () { var options, name, src, copy, copyIsArray, clone, target = arguments[0] || {}, i = 1, length = arguments.length, deep = false; if (typeof target === "boolean") { deep = target; target = arguments[i] || {}; i++; } if (typeof target !== "object" && typeof target !== "function") { target = {}; } for (; i < length; i++) { if ((options = arguments[i]) != null) { for (name in options) { src = target[name]; copy = options[name]; if (name === "__proto__" || target === copy) { continue; } if (deep && copy && (isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) { if (copyIsArray && !Array.isArray(src)) { clone = []; } else if (!copyIsArray && !isPlainObject(src)) { clone = {}; } else { clone = src; } copyIsArray = false; target[name] = merge(deep, clone, copy); } else if (copy !== undefined) { target[name] = copy; } } } } return target; };
|
附1:jquery重构了的一段代码
1 2 3 4 5 6 7 8 9 10 11 12
| if (deep && copy && (jQuery.isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) { if (copyIsArray) { copyIsArray = false; clone = src && Array.isArray(src) ? src : []; } else { clone = src && jQuery.isPlainObject(src) ? src : {}; }
target[name] = jQuery.extend(deep, clone, copy); } else if ( copy !== undefined ) { target[name] = copy; }
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| if (deep && copy && (isPlainObject(copy) || (copyIsArray = Array.isArray(copy)))) { if (copyIsArray && !Array.isArray(src)) { clone = []; } else if (!copyIsArray && !isPlainObject(src)) { clone = {}; } else { clone = src; } copyIsArray = false;
target[name] = merge(deep, clone, copy); } else if (copy !== undefined) { target[name] = copy; }
|
代码明显下面好看了许多,可以学习一下这种重构方式
附2:isEmptyObject、isPlainObject
1.isEmptyObject
1 2 3 4 5 6 7 8 9 10 11
| isEmptyObject: function (obj) { var name;
for (name in obj) { return false; } return true; }
JSON.stringify(obj) == "{}"
|
2.isPlainObject
1 2 3 4 5 6 7 8 9 10 11 12
| function isPlainObject (target) { if (!target || Object.prototype.toString.call(target) !== "[object Object]") return false;
const proto = Object.getPrototypeOf(target); if (!proto) return true;
const ctor = proto.constructor; return typeof ctor === "function" && ctor === Object; }
|
参考
https://blog.csdn.net/weixin_33694172/article/details/89369987