Задать вопрос
@Cruper
web-падаван

Как изменить сеттер свойства у объекта в другой функции?

Как при необходимости модифицировать сеттер объекта, не изменяя его объявление, если
при использовании Object.defineProperty this указывает на объект, вызвавщий этот метод?
При попытке воспользоваться функцией Object.defineProperty.call(...), this все равно указывает на объект, вызвавший эту функцию.
Примерный кусок кода:
class Foo {
    public ModifySetter(obj: object, field: string): void {
        Object.defineProperty(obj, field, {
            set: (value) => {
                console.log(this); // объект класса Foo
                this[field] = value;
                // some actions
            },
            get: () => this[field]
        });
    }
}


const bar = (field) => {
       Object.defineProperty(this, field, {
            set: (value) => {
                console.log(this); // объект класса Foo
                this[field] = value;
                // some actions
            },
            get: () => this[field]
        });
}

class Foo {
    public ModifySetter(obj: object, field: string): void {
        bar.call(obj, field);
    }
}
  • Вопрос задан
  • 145 просмотров
Подписаться 1 Средний 1 комментарий
Помогут разобраться в теме Все курсы
  • Skillbox
    JavaScript
    3 месяца
    Далее
  • Яндекс Практикум
    Фронтенд-разработчик расширенный
    13 месяцев
    Далее
  • Академия Eduson
    Fullstack-разработчик на JavaScript
    11 месяцев
    Далее
Решения вопроса 1
@Cruper Автор вопроса
web-падаван
Смена контекста внутри метода класса не работает. (Особенности компиляции typescript в js, как я понял).
Однако сменить контекст, когда вызывается метод класса возможно.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@Coder321
class Foo {
    constructor() {
        this._field = '';
    }

    set field(value) {
        this._field = value+='Foo';
    }

    get field() {
        return this._field;
    }
}

class MyFoo extends Foo {
    set field(value) {
        super.field = value;
        this._field += 'MyFoo';
    }
}
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы