与JavaScript中函数的Object.assign()等效

与JavaScript中函数的Object.assign()等效,javascript,Javascript,Object.assign的一个常见用例是修改(或完全替换)对象的属性,而不更改对该对象的引用,因此具有该引用的其他内容也会更新 对于函数的内容也有这样做的方法吗 例如: const a = () => console.log('a'); const b = a; doSomethingMagicalHere(b, () => console.log('b')); b(); // prints 'b' a(); // prints 'b' 首先,在您的示例中有一件事我不理解,即co

Object.assign
的一个常见用例是修改(或完全替换)对象的属性,而不更改对该对象的引用,因此具有该引用的其他内容也会更新

对于函数的内容也有这样做的方法吗

例如:

const a = () => console.log('a');
const b = a;
doSomethingMagicalHere(b, () => console.log('b'));
b(); // prints 'b'
a(); // prints 'b'

首先,在您的示例中有一件事我不理解,即const的使用。如果在第3行重新分配b,为什么要使用常量b

无论如何,在Javascript中,大多数变量都使用引用。例如,在下面的代码中,常量a被定义为一个函数,变量b是对a的引用,所以当给b分配一个新函数时,实际上也分配了a

我希望我没有误解你的意思

编辑#1 我将把函数a存储在一个静态对象中,而不是将其声明为一个常量(之后将重新分配)。对象引用/指针本身就是一个常量,但其内容、属性不被视为不可变的。()

//定义一个指向静态对象的常量引用/指针
常数oA={
//定义可变属性“f”
f:()=>console.log('a')
};
//为同一对象定义另一个常量ref,称为oB
常数oB=oA;
//更新oB.f ref所指的值
oB.f=()=>console.log('b');
//应调用oB.f/“b”
oB.f();
//应调用oA.f/'b'
oA.f();
//使用Object.defineProperty
Object.defineProperty(oA,'f'{
__原型:空
,值:()=>console.log('f')
});
//应调用oB.f/“f”
oB.f();
//应调用oA.f/'f'
oA.f()
有没有办法修改/替换函数的内容

不,那完全不可能。函数的行为(即调用它将做什么)在Javascript中是不可变的

当然,如果事先知道要更改函数的行为,可以将函数设置为一个闭包,该闭包依赖于某个外部的可交换状态来确定它应该做什么:

const a = function f(...args) { return f.contents.call(this, ...args); }
a.contents = () => console.log('a');
a(); // prints 'a'
Object.assign(a, {contents(){ console.log('b') }});
a(); // prints 'b'

为什么不直接替换包含该函数的对象上的函数呢?将其设为let而不是consts,等价的是,对函数的引用在两者之间是相同的。与C中的指针类似,您可以在不更改引用的情况下更改它的值,因此当您更改一个指针的内容时,另一个指针的内容也会更新。这是一种延伸,可能不存在,但我希望有一些我不知道的东西。正确的答案会使我的示例代码的功能如所述。@8472我的示例过于简单,但在真实的示例中,我试图模拟/存根一个实际上是函数的React组件,唯一的方法是更新函数的功能,而不只是给它赋值(在测试文件中),因为新值不会反映在实际代码中。@samanime您可能应该在问题中包含该信息。请参阅“不只是为其指定新值”-同样,您没有给出原因。我的示例有点不正确。我已经更新了。const的要点是我不想更改引用,只想更改它的值(有点像C中的指针)。即使我仍然不明白为什么,我还是更新了我的注释。查看编辑,在第一种情况下,分配给b不会影响a。Javascript确实使用引用,这从传递(引用到)数组和对象并对其进行变异可以看出,但在本例中,您为指向新函数的b分配了一个新引用。类似于C,A和b都是指针,你给b分配了一个新指针,希望A也能更新。谢谢,我也想到过类似的事情。不幸的是,在我的特殊情况下,是React创建了从ES6和JSX协调语法转换的函数,因此我无法直接控制函数的发生方式。@Bergi your response“函数的行为(即调用它将做什么)在Javascript中是不变的。”提醒我这个问题:@samanime这与语法无关(在ES5中也一样),您只需要控制函数定义(或者能够覆盖它)。也许你应该考虑一下你的实际用途case@Bergi我知道。我的意思是,我没有机会总结它,因为我实际上正在编写(使用类语法)转换为这些函数的类。我问了一个关于我具体问题的问题,但我也想问这个问题,看看是否有什么聪明的东西我不知道。我明白了,谢谢。不,你没有错过任何聪明的东西。
const a = function f(...args) { return f.contents.call(this, ...args); }
a.contents = () => console.log('a');
a(); // prints 'a'
Object.assign(a, {contents(){ console.log('b') }});
a(); // prints 'b'