该项目的 GitHub 地址为 underscore-analysis,所有文章都在这里,并将不断更新。如果你觉得我的解读还可以,对你学习 js 有一定的帮助,欢迎 Watch && Star,你的关注和肯定必定会促使我投入更多的时间和经历做好这个系列。如果你愿意的话,也欢迎 Fork,我们一起来将这个系列做好做大,一起成长。
扩展
underscore 提供了三个方法来扩展对象的属性和方法:
_.extend(destination, objs)
_.defaults(destination, objs)
_.extendOwn(destination, objs)
这三个方法很相似,都是将 objs (一个或多个对象)中的属性浅复制到 destination 对象中。
不同的是:
_.extend()
会将 objs 的所有属性(包括继承的)一起复制,如果出现同名属性,前面的会被覆盖,既属性值取最后一次重复出现时的属性值。_.defaults()
也是复制 objs 的所有属性,与_.extend()
唯一一点区别是后面的同名属性不会覆盖前面的,最终该属性的属性值取 第一次 出现时的值。_.extendOwn()
与_.extend()
的唯一一点区别是只复制 objs 自身的属性。
示例:
源码解读:
|
可以看出来两个方法都严重依赖了一个 underscore 的内部函数 createAssigner
这个函数根据不同的要求(只复制自身属性还是包括继承属性),生成一个属性分配器函数并返回,然后由这个属性分配器函数接收具体的对象,实现属性扩展的具体逻辑
|
克隆
underscore 提供了一个用于对象克隆(浅)的方法:_clone(obj)
该方法接收一个对象为参数,然后返回一个此对象副本,作为参数的对象中任何嵌套的对象和数组都只被复制了对应的引用给返回的对象副本。
示例:
注:
无论是数组还是对象,虽然 clone 返回的数组/对象与原来的数组/对象不在同一个地址了,比直接赋值的浅复制深,但它所执行的仍然是浅复制,返回数组/对象内部嵌套的数组和对象仍然只是引用。
源码解读: