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!"
但我希望输出为 "Hooray!"。
到目前为止,我发现 Object.assign 只复制目标中的方法,但不会 link 它们。
关于继承和组合,我在这里找到了有用的博文:Why prototypical inheritance matters and most dominantly here: Understanding Prototypes, Delegation & Composition
我想在一个对象中混合一个方法,但不是复制这些方法,更确切地说,我想对混合函数的定义进行赋值。
这怎么可能?
或者,您再次调用分配。或者你可以这样做:(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",您只能通过原型 link 从另一个对象继承(尽管您可以构建继承链)。
如果您希望将多个独立对象混合到现有的 A
对象中,那是不可能的。对不起。
如果我创建对象 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!"
但我希望输出为 "Hooray!"。 到目前为止,我发现 Object.assign 只复制目标中的方法,但不会 link 它们。 关于继承和组合,我在这里找到了有用的博文:Why prototypical inheritance matters and most dominantly here: Understanding Prototypes, Delegation & Composition
我想在一个对象中混合一个方法,但不是复制这些方法,更确切地说,我想对混合函数的定义进行赋值。
这怎么可能?
或者,您再次调用分配。或者你可以这样做:(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",您只能通过原型 link 从另一个对象继承(尽管您可以构建继承链)。
如果您希望将多个独立对象混合到现有的 A
对象中,那是不可能的。对不起。