我有一个类实例(在我的情况下是URL
),称为req_url
。 URL
的一个属性为其属性之一(search
)提供了一个setter,这对我来说是一种有问题的实现方式(不仅是设置给定值,而是先对其进行操作)。
如何在不创建从URL
继承的类的情况下重写该设置器,然后创建一个不同的设置器?
defineProperty
不起作用,因为它在Object
级别起作用。我想在该特定类型级别上执行此操作。
[只要您有一个要绕过设置器的实例,就可以在该实例上调用Object.defineProperty
来设置该属性:
class Foo {
set prop(arg) {
console.log('setter invoked');
}
}
const f = new Foo();
Object.defineProperty(f, 'prop', { value: 'val' });
console.log(f.prop);
它不会影响any对象,它只会影响显式调用Object.defineProperty
的对象。与您似乎担心的其他对象的碰撞不会发生。
另一个(陌生人)选择是删除原型上的setter,但是如果在代码之外的其他地方使用该类,则可能会导致问题:
class Foo {
set prop(arg) {
console.log('setter invoked');
}
}
delete Foo.prototype.prop;
const f = new Foo();
f.prop = 'val';
console.log(f.prop);