起因
最近在重构以前写过的javascript代码,目的是为了去掉对jQuery的依赖。其中有多处用到了$.extend()
方法,自然而然会想到这么一个问题:如何用自己的方式来实现?
思路
首先,定义函数的功能:传入多个对象,将多个对象的内容合并到第一个对象中,最后返回合并后的对象,即参数中的第一个对象。这样的定义是否似曾相识?没错,和ES6中的新特性Object.assign()
几乎一模一样。所以,可以从探索Object.assign()
开始。
探索Object.assign()
Object.assign(target, ...sources)
使用场景
拷贝对象
只需要传入的第一个参数是空对象即可:
合并对象
注意第一个传参将会被改变,所以如果不想改变第一个有值参数,可以传入一个空对象:
注意事项
- 在
Object.assign()
中,原型属性和非可枚举属性不会被拷贝。(两种属性的解释)
|
|
- 元类型会被转化为对象
|
|
- 异常会抛出,但是已经执行的代码会生效
|
|
pollyfill
上面是对Object.assign()
概念层面的探索,由于要考虑旧版本浏览器兼容性问题,需要写一个pollyfill,其实这才是重头戏。不过,只有理解了Object.assign()
都干了些什么,才有可能写出来:
|
|
结束
好了,现在可以在宿主环境大胆使用Object.assign()
了,Let’s rock it~~~