繁体   English   中英

Javascript:如何在不复制但通过链接的情况下将另一个对象B的方法混入对象A?

[英]Javascript: How can I mix in methods of another Object B to my Object A without copying but with linking?

如果创建对象A:

let A = {};

并想混入另一个对象B中的方法:

let B = {
    foo() {
        alert("Boo!");
    }
};

通常我会打电话给:

Object.assign(A, B);

然后我改变我的函数foo:

Object.assign(B, {
    foo() {
        alert("Hooray!");
    }
});

之后,我叫foo:

A.foo(); // Actual output: "Boo!"

但我希望那个输出是“万岁!”。 到目前为止,我发现,Object.assign只复制目标中的方法,但它不会链接它们。 关于继承和组合我在这里找到了有用的博客: 为什么原型继承很重要 ,最重要的是: 理解原型,授权和组合

我想在一个Object中混合一个方法,但不要复制方法,更多的是我想要一个赋值混合函数的定义。

这怎么可能?

要么,您再次调用分配。 或者,您也可以执行以下操作:(但是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”,你只能通过原型链接继承其他对象(尽管你可以构建一个继承链)。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM