Lodash源码阅读-baseAssignIn

Lodash 源码阅读-baseAssignIn

功能概述

baseAssignIn 是 Lodash 内部的一个工具函数,主要用于将源对象的所有可枚举属性(包括继承的属性)复制到目标对象上。它是实现 _.assignIn 和 _.extend 等方法的基础,特点是会复制源对象上的自有属性和继承属性。

前置学习

依赖函数

  • copyObject:负责将属性从源对象复制到目标对象的工具函数
  • keysIn:获取对象的所有可枚举属性名(包括继承的属性)的函数

技术知识

  • JavaScript 原型链:理解原型继承和属性查找机制
  • 可枚举属性:了解 JavaScript 中属性的可枚举性概念
  • 对象复制:浅拷贝和属性赋值的基本知识

源码实现

javascript 复制代码
function baseAssignIn(object, source) {
  return object && copyObject(source, keysIn(source), object);
}

实现思路

baseAssignIn 的实现思路非常简洁明了:

  1. 首先检查目标对象(object)是否存在(不是 null 或 undefined)
  2. 如果目标对象存在,则:
    • 使用 keysIn 获取源对象的所有可枚举属性名(包括继承的属性)
    • 通过 copyObject 将这些属性从源对象复制到目标对象
  3. 最后返回处理后的目标对象

这个函数的关键特点是它使用了 keysIn 而不是 keys,这使得它能够复制源对象的继承属性,而不仅仅是自有属性。

源码解析

让我们逐步分析 baseAssignIn 函数的实现:

javascript 复制代码
function baseAssignIn(object, source) {

函数定义,接收两个参数:

  • object:目标对象,要将属性复制到的对象
  • source:源对象,要从中复制属性的对象
javascript 复制代码
  return object && copyObject(source, keysIn(source), object);
}

这一行代码包含了函数的全部逻辑,可以分解为两个部分:

  1. object &&:这是一个短路逻辑与操作,确保目标对象存在(不是 null 或 undefined)。如果 object 是 falsy 值,函数会直接返回该值(一般是 undefined、null 等),不进行后续操作。

  2. copyObject(source, keysIn(source), object):这是函数的核心逻辑,分解来看:

    • keysIn(source):获取源对象的所有可枚举属性名(包括继承的属性)。与 keys 不同,keysIn 会遍历整个原型链,获取所有可访问的属性。
    • copyObject(source, keysIn(source), object):调用 copyObject 函数,将 source 对象中由 keysIn(source) 返回的所有属性复制到 object 对象上。

整个函数巧妙地利用了短路评估和函数组合,用极简的代码实现了完整的功能。

baseAssignIn 与 baseAssign 的区别

baseAssignIn 和 baseAssign 是两个相似但有重要区别的函数:

  1. baseAssign:

    javascript 复制代码
    function baseAssign(object, source) {
      return object && copyObject(source, keys(source), object);
    }

    使用 keys(source) 只获取源对象自身的可枚举属性。

  2. baseAssignIn:

    javascript 复制代码
    function baseAssignIn(object, source) {
      return object && copyObject(source, keysIn(source), object);
    }

    使用 keysIn(source) 获取源对象自身和继承的所有可枚举属性。

这个区别决定了这两个函数处理原型链上属性的不同行为,也是它们各自对应的公开 API(_.assign 和 _.assignIn)功能差异的根本原因。

总结

baseAssignIn 是 Lodash 中一个设计精巧的内部工具函数,它通过结合 copyObject 和 keysIn 函数,高效地实现了对象属性的复制,包括继承的属性。设计体现了以下编程原则:

  1. 单一职责原则:函数只负责一件事情,即复制包括继承属性在内的所有可枚举属性
  2. 组合优于继承 :通过组合使用 copyObject 和 keysIn 实现功能,展示了函数组合的强大
  3. 防御性编程:通过短路逻辑检查参数有效性,增强代码健壮性
相关推荐
子兮曰6 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰6 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万6 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝6 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋6 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁6 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄6 天前
JavaScript 隐式全局变量解析
javascript
汉堡大王95276 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大6 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师6 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端