重写传递给函数的对象
Overriding an object that was passed to a function
我最近想知道这是否可能:将对象传递给函数并在该函数内部使用完全不同的对象覆盖整个对象,以便其值被永久修改。由于对象是通过引用传递的,我有一种感觉,它必须以某种方式工作,但我不知道如何。在代码中,它应该这样做:
function a() {
console.log("i am a");
}
function b() {
console.log("i am b");
}
function override(func1, func2) {
func1 = func2;
}
override(a, b);
a(); //"i am b" expected
小提琴
这显然不起作用,因为我只是重写了变量func1
,但我想你明白了。我选择使用函数而不是纯对象,因为您可以轻松地通过删除对象的属性并从第二个对象复制新属性来"覆盖"对象。但那不是我想要的。
在你问之前,我不是想用这个来解决任何现实生活中的问题,我只是好奇地问一下。那么有没有办法做到这一点,如果没有,有什么原因吗?
谢谢!
这不起作用,因为虽然JS传递对函数的引用,这仅仅意味着您的func1
和func2
参数最终引用了标识符a
和b
引用的相同函数(对象),但是当您更改func1
引用的内容时,这并不影响a
引用的内容。
换句话说,当你把一个对象传递给一个函数时,这个函数可以通过修改、添加或删除属性来改变对象的内容,但是它不能改变函数外部变量所指向的对象。(至少,不能通过函数自己的参数——函数可以修改其作用域链中的变量,直到并包括全局变量,但它必须通过引用它们自己的名称来完成。)
在你的代码中
function override(func1, func2) {
func1 = func2;
}
func1
是指向函数a
的变量,func2
是指向函数b
的变量。语句func1 = func2
使func1
指向b,它不会改变函数override
之外的任何内容。
请使用对象来使用通过引用传递。下面给出的代码说明了它是如何工作的。
function a() {
console.log("i am a");
}
function b() {
console.log("i am b");
}
var object1 = {
func1:a
};
var object2 = {
func2:b
}
function override(object1, object2) {
object1.func1 = object2.func2;
}
override(object1, object2);
object1.func1(); //"i am b"
此代码仅用于演示,在实际场景中可能不会有用。
相关文章:
- 创建对象函数原型和代码是错误的
- JavaScript模块模式-如何在使用对象/函数之前激发构造函数/init函数
- 如何从onclick字符串中引用javascript对象函数
- 更改对象函数仅用于示例
- javascript和jQuery的嵌套对象函数中的变量范围
- 将对象函数传递给请求动画帧时丢失对象引用
- 对象函数返回函数而不是值
- 使用onclick调用属性对象函数
- javascript拉斐尔对象函数传递
- 如何从onClick事件调用对象函数
- 可以't获取具有“t”的对象变量;这个“;由setTimeout()函数调用的对象函数中的属性
- 对象没有't继承父对象函数
- 调用父对象函数
- "这个“;对象函数内部的引用
- 将变量添加到对象函数调用的末尾
- 传单错误:对象函数没有方法'createIcon'在LayerGroup中创建自定义图标标记时
- TypeError:对象函数Object(){〔本机代码〕}没有方法'方法'
- 挖空 - 单击绑定到对象函数 - 范围问题
- 类型错误: 对象函数...没有方法“打开”
- JavaScript 对象函数