Почему на имя класса можно ссылаться внутри класса, даже если оно было переопределено? - PullRequest
0 голосов
/ 13 сентября 2018

Следующее, как и следовало ожидать, не работает:

let User = {
    foo() {
        User.prop = 1;
    }
};

let User2 = User;
User = null;

User2.foo();  // Cannot set property of null
console.log(User2.prop);

Это работает, хотя:

class User {
    static foo() {
        User.prop = 1;
    }
}

let User2 = User;
User = null;

User2.foo();
console.log(User2.prop);  // 1

Поскольку функции и классы являются объектами, и в обоих случаях яустановить свойство для этого, почему результаты отличаются?Где он получает User ссылку?

Ответы [ 3 ]

0 голосов
/ 13 сентября 2018

Подобно выражениям именованных функций , class es заключены в дополнительную область, содержащую неизменяемую привязку с их именем и значением.

Если мы верно вернем синтаксис class в ES5, мы получим что-то вроде

let User = (() => {
    const User = function() {};
//  ^^^^^^^^^^
    User.foo = function() {
        User.prop = 1;
    };
    return User;
})();

let User2 = User;
User = null;

User2.foo();
console.log(User2.prop);  // 1

Это внутреннее объявление User - это то, над чем закрывается метод foo. Перезапись внешней переменной для него не имеет значения.

0 голосов
/ 13 сентября 2018

Внутри объявления класса имя этого класса постоянно связано. Это только одно из различий между классами-конструкторами старой школы и собственно классами ES2015. (Еще одно важное различие в том, что функции с заданным именем можно безопасно переопределить, но классы с тем же именем не могут.)

0 голосов
/ 13 сентября 2018

Во втором примере вы получаете 1, потому что ссылаетесь на статическую переменную, даже если она находится внутри класса, который не был создан перед его использованием. Снятие статики и создание правильного экземпляра в любом случае возвращает 1:

class User {
    foo() {
        this.prop = 1;
    }
}

let User2 = new User();
User = null;

User2.foo();
console.log(">>" + User2.prop);  // 1

Примечание User = null не имеет значения.

...