Javascript:我如何将另一个对象B的方法混合到我的对象A中,而不进行复制,而是进行链接?

Javascript:我如何将另一个对象B的方法混合到我的对象A中,而不进行复制,而是进行链接?,javascript,pointers,mixins,assignment-operator,Javascript,Pointers,Mixins,Assignment Operator,如果我创建了一个对象A: let A = {}; 并希望混合来自另一个对象B的方法: let B = { foo() { alert("Boo!"); } }; 通常我会打电话: Object.assign(A, B); 然后我更改我的函数foo: Object.assign(B, { foo() { alert("Hooray!"); } }); 在那之后,我叫傅: A.foo(); // Actual output: "

如果我创建了一个对象A:

let A = {};
并希望混合来自另一个对象B的方法:

let B = {
    foo() {
        alert("Boo!");
    }
};
通常我会打电话:

Object.assign(A, B);
然后我更改我的函数foo:

Object.assign(B, {
    foo() {
        alert("Hooray!");
    }
});
在那之后,我叫傅:

A.foo(); // Actual output: "Boo!"
但我希望输出是“万岁!”。 到目前为止,我发现Object.assign只复制目标中的方法,但它不链接它们。 关于继承和组合,我在这里找到了有用的博客帖子:最主要的是:

我想在一个对象中混合一个方法,但不是复制这些方法,更确切地说,我想给混合函数的定义赋值


这怎么可能呢?

您也可以再次调用assign。或者您可以这样做:(javascript中没有指针,但是:对象总是通过引用传递(与数字、字符串等通过值传递的普通值不同)

因此:

var my = {
   f: function() { return "haa" }
}

var o1 = {};
Object.assign(o1, {my: my}); // this is the crucial point, you are assigning a reference to my
o1.my.f() // "haa";
my.f = function() { return "hoooo" };
o1.my.f() // "hoooo";

经过一些研究,我发现了更简单的东西:

var my = {
   f: function() { return "haa" }
}

var o1 = new Object(my); // create an object of the prototype my;

o1.f(); // haa;

my.f = function() { return "hoooo" };

o1.f() // hoooo

或者,您可以再次调用assign。或者您可以这样做:(javascript中没有指针,但是:对象总是通过引用传递的(与数字、字符串等通过值传递的普通值不同)

因此:

var my = {
   f: function() { return "haa" }
}

var o1 = {};
Object.assign(o1, {my: my}); // this is the crucial point, you are assigning a reference to my
o1.my.f() // "haa";
my.f = function() { return "hoooo" };
o1.my.f() // "hoooo";

经过一些研究,我发现了更简单的东西:

var my = {
   f: function() { return "haa" }
}

var o1 = new Object(my); // create an object of the prototype my;

o1.f(); // haa;

my.f = function() { return "hoooo" };

o1.f() // hoooo

原型继承可以帮助您:

var A = Object.create(B);
A.foo();
B.foo = …;
A.foo(); // something else
当然,这不再是严格意义上的“mixin”,您只能通过prototype链接从另一个对象继承(尽管您可以构建继承链)


如果您希望将多个独立对象混合到现有的
A
对象中,那么这是不可能的。很抱歉。

原型继承可以帮助您:

var A = Object.create(B);
A.foo();
B.foo = …;
A.foo(); // something else
当然,这不再是严格意义上的“mixin”,您只能通过prototype链接从另一个对象继承(尽管您可以构建继承链)



如果您希望将多个独立对象混合到现有的
A
对象中,那么这是不可能的。对不起。

您是否尝试调用object.assign(A,B);在您更改函数后再次执行?因此,基本上,当您从
B
分配
A
某些函数,然后从
B
更改该函数时,您希望该更改也出现在
A
的版本中吗?@RenCamp您是对的,这是更新我的代码的一个可能的解决方案。但问题是是否有一个p没有显式复制函数的可能性?@NickZuber是的,没错。我上传了一个关于多个独立对象的新问题(非常类似)。请看一下您是否尝试调用Object.assign(a,B);在您更改函数后再次执行?因此,基本上,当您从
B
分配
A
某些函数,然后从
B
更改该函数时,您希望该更改也出现在
A
的版本中吗?@RenCamp您是对的,这是更新我的代码的一个可能的解决方案。但问题是是否有一个p不显式复制函数是否可行?@NickZuber是的,没错。我上传了一个关于多个独立对象的新问题(非常类似)。请看一看,我在JSFIDLE上尝试过,它说a.foo()不是我键入的函数:Object.assign(a,{B:B});我想这是因为Object.assign不是“deep”?我的意思是它没有添加对象的对象的方法…对不起,我在代码中有一个输入错误。现在它应该可以工作了:另一句话:它使用Object.assign(o1,{f:my})并调用o1.f.f(),但再一次,这不是我想要的…japp,这是我在fiddle中更新的。我知道你想要什么,但这在JavaScript中是不可能的。你想立即添加一个函数作为引用/指针(如C中的&sth),但在JavaScript中,只有对象是这样传递的。函数、数字、布尔值和字符串只能通过值传递。因此,您需要额外的步骤将函数包装到对象中。在我发布的第一个链接中,博主说(向下滚动一点):传播对原型的更改,我认为这在某种程度上描述了这一点?但我不理解代码,因为我不是JavaScript开发专家……我在JSFIDLE上尝试过,它说A.foo()不是我键入的函数:Object.assign(A,{B:B});我想这是因为Object.assign不是“deep”?我的意思是它没有添加对象的对象的方法…对不起,我在代码中有一个输入错误。现在它应该可以工作了:另一句话:它使用Object.assign(o1,{f:my})并调用o1.f.f(),但再一次,这不是我想要的…japp,这是我在fiddle中更新的。我知道你想要什么,但这在JavaScript中是不可能的。你想立即添加一个函数作为引用/指针(如C中的&sth),但在JavaScript中,只有对象是这样传递的。函数、数字、布尔值和字符串只能通过值传递。因此,您需要额外的步骤将函数包装到对象中。在我发布的第一个链接中,博主说(向下滚动一点):将更改传播到原型,我认为这在某种程度上说明了这一点?但我不理解代码,因为我不是JavaScript开发专家……ES6中有一种使用代理的方法,但您可能不希望这样。我不在乎它如何工作,如果可能的话,ES6和代理都很好!请回答我的新问题。非常感谢,yo感谢您的帮助!!:@FloJ12:Georg基本上已经给出了我应该给出的…ES6中有一种使用代理的方法,但您可能不希望这样。我不在乎它如何工作,如果可能的话,ES6和代理都很好!请回答我的新问题。非常感谢您的帮助!!:)@弗洛12:乔治基本上已经给了我我会给的