Как стать автором
Обновить

Комментарии 5

А я в упор не понимаю этой истерии с запретом доступа к this до вызова super().

Всегда можно налететь на такой кейс

class A {
    constructor(param: string) {
        this.a = param;
        this.test();
    }
    public a : string;
    public test() {
        console.log(this.a)
    }
}

class B extends A {
    constructor(param1: string, param2:string) {
        super(param1)
        this.b = param2;
    }
    public b : string;
    public test() {
        console.log(this.a + ' ' + this.b);
    }
}

new B('foo', 'bar'); // "foo undefined" 

Потыкать плейграунд

При этом если заткнуть тайпскрипт варнинг и таргетиться в es5 всё будет прекрасно работать. Нет никакого технического ограничения почему нужно это запрещать. Имхо это работа линтера и детект такого кода должен быть исключительно опционален. И я опечален тем что такие искуственные и неоднозначные ограничения тащат в язык.

super надо вызывать по другой причине. До его вызова объекта просто не существует. А после вызова this будет указывать на созвращённый родительским конструктором объект.

class A {
    constructor() {
        return { foo: 'bar' }
    }
}

class B extends A {
    constructor() {
        super()
        console.log( this.foo ) // bar
    }
}

Спасибо за пример, запамятовал что так можно. Хотя именно это в JS колассах я бы как раз запретил ибо всё ооп ломается и прототип кривой присваивается если руками возвращаешь другой объект, ибо прототип был прописан до того как отдать объект в конструктор

Это не просто так ввели, а чтобы можно было расширять классы хоста типа дом элементов. То есть сначала создаётся хостовой объект, к нему js-биндинг, а потом уже этот биндинг донастраивается в дочерних конструкторах.

А после вызова this будет указывать на созвращённый родительским конструктором объект.

В этом весь JavaScript

Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории