gpt4 book ai didi

javascript - 如何将方法从某个类的实例复制到对象

转载 作者:行者123 更新时间:2023-12-02 06:30:51 25 4
gpt4 key购买 nike

给定的类

class Test {
test() {
console.log('test called');
}
}

还有一些对象 toExtend = {}

我怎样才能扩展这个对象,让它有 test 方法?

Object.assign(以及 _.extend_.assign$.extend)不要复制方法。最好的方法是什么?

注意toExtend是从外部传入的

更新:toExtend 是另一个类的实例并且有自己的原型(prototype)方法

最佳答案

对象字面量

对于没有自己原型(prototype)的对象文字(Object.getPrototypeOf(toExtend) === Object.protoype)),您可以简单地使用 Object.setPrototypeOf扩展对象:

class Test {
test() {
console.log('test called');
}
}

const toExtend = {};

// Set the prototype, so you "inherit" methods:
Object.setPrototypeOf(toExtend, Test.prototype);
toExtend.test();

在较旧的运行时中,您必须手动分配原型(prototype):

function Test() {
// noop ctor
}

Test.prototype.test = function() {
console.log('test called');
};


var toExtend = {};

// Set the prototype, so you "inherit" methods:
toExtend.__proto__ = Test.prototype;
toExtend.test();

类实例

对于现有类的实例,事情要复杂得多。他们确实有自己的原型(prototype),可能具有必须复制的属性,因此您需要遍历这些:

class Foo {
test() {
console.log('test');
}
}

class Bar {
toast() {
console.log('toast');
}
}

function dynamicExtend(target, base) {
const baseProto = Object.getPrototypeOf(target);
if (baseProto == Object.prototype) {
// simple case: no existing prototype
Object.setPrototypeOf(target, base.prototype);
} else {
// complex case: existing prototype
const proxyClass = class extends base {};
const proxyProto = proxyClass.prototype;

// assign the target properties
Object.getOwnPropertyNames(baseProto).forEach(n => {
const desc = Object.getOwnPropertyDescriptor(baseProto, n);
Object.defineProperty(proxyProto, n, desc);
});

Object.setPrototypeOf(target, proxyProto);
}
}

const targets = [{},
new Bar()
];

targets.forEach(t => {
dynamicExtend(t, Foo);
t.test();
if (t.toast) {
t.toast();
}
});

请注意,由于代理类,这确实会破坏 instanceof 样式的继承检查。

__proto__

作为@PatrickRoberts noted在评论中,__proto__ is deprecated ,因此您应该尽可能使用 setPrototypeOf

关于javascript - 如何将方法从某个类的实例复制到对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37886299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com