Вы можете использовать Reflect.set()
с необязательным аргументом receiver
, например:
class Grandparent {
set myField(value) {
console.log('Grandparent setter');
}
}
class Parent extends Grandparent {
set myField(value) {
console.log('Parent setter');
}
}
class Child extends Parent {
set myField(value) {
Reflect.set(Grandparent.prototype, 'myField', value, this);
}
}
new Child().myField = 'foo';
Если у вас нет явной ссылки на Grandparent.prototype
, вместо этого вы можете использовать Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(this)))
, что, очевидно, намного менее предпочтительно.Вы можете создать вспомогательную функцию:
function getPrototypeOf (target, level = 1) {
return level > 0 ? getPrototypeOf(Object.getPrototypeOf(target), level - 1) : target;
}
и использовать getPrototypeOf(this, 3)
вместо Grandparent.prototype
для возврата цепочки прототипов прародителю:
function getPrototypeOf (target, level = 1) {
return level > 0 ? getPrototypeOf(Object.getPrototypeOf(target), level - 1) : target;
}
class Grandparent {
set myField(value) {
console.log('Grandparent setter');
}
}
class Parent extends Grandparent {
set myField(value) {
console.log('Parent setter');
}
}
class Child extends Parent {
set myField(value) {
Reflect.set(getPrototypeOf(this, 3), 'myField', value, this);
}
}
new Child().myField = 'foo';