Object.assign以函数为首个参数的执行逻辑及调用疑问
问题解答
先纠正你对Object.assign的核心误解
你误以为const test = Object.assign(testFn, testFactories)是把testFn的执行结果和testFactories合并,但实际上Object.assign的第一个参数是目标对象/值,不是函数调用结果。这里的目标是testFn这个函数本身——因为JS里函数本质也是对象,可以像普通对象一样添加属性。
代码执行的完整逻辑拆解
- 合并阶段:
Object.assign(testFn, testFactories)会把testFactories里的object、set方法,复制到testFn这个函数对象上,然后返回testFn本身。所以test变量其实就是被添加了额外属性的testFn函数,不是新的独立对象。 - 调用阶段:当你执行
test({a:1})时,本质是调用testFn函数,而testFn里写的是return test.object(value)。此时test已经指向了合并后的函数,test.object就是从testFactories复制过来的那个object方法,所以会执行它,打印"go to object"并返回{test: {a:1}}。
你的错误逻辑对比
你原本想写的const test = Object.assign(test.object({a:1}), testFactories)是完全不同的逻辑:这会先执行test.object({a:1})(但此时test还没定义,会直接报错),再把这个执行结果和testFactories合并成新对象。但实际代码里的Object.assign操作的是函数本身,不是函数的执行结果。
内容的提问来源于stack exchange,提问作者Moon
相关产品推荐
相关产品推荐

