jack_azizov
@jack_azizov

Объясните как работает код?

Всем привет. Ребят подскажите пожалуйста , вот Код

335 строка .

почему если в функции function Article() изменить :

Article.count++;
Article.result = this.created

На

this.count++;
this.result = this.created

То результат становится иным. Это замыкания ?

this же ссылается на объект ? т.е. получается на момент создания этого куска кода Article является функцией и поэтому this не ссылается на него ?Почему тогда this.created срабатывает. Помогите разжевать пжл
  • Вопрос задан
  • 273 просмотра
Решения вопроса 1
alvvi
@alvvi
export default apathy;
Потому что когда мы создали новый инстанс (объект)
new Article();
this внутри конструктора стал ссылаться именно на этот интсанс , Article же ссылается на саму функцию-конструктор Article, куда мы и добавили свойство count и метод ShowStats;
Наглядно это можно увидеть сделав console.log одного из инстансов и проинспектировав свойство конструктор его прототипа.
spoiler
59dd9924e190466b87da7ccba100a407.png

Внутри конструктора при создании инстанса мы хотим инкрементировать именно свойство на этом конструкторе, инстансы свойства count не имеют, соответсвенно this.count++ превратится в this.count = undefined + 1 == NaN.

Article.count сответственно останется равным 0. Article.result будет равен undefined, потому что на конструкторе он вообще не был объявлен, и теперь будет являтся свойством инстанса.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
kurtov
@kurtov
Article.count и this.count находятся на разных уровнях цепочки прототипов
Если вам знакомо ООП из других языков, то Article.count - статическое свойство класса.
new Article() создает новый объект, если вы добавите this.count = 1 внутрь конструктора, то
function Article() {
  this.count = 111;
  Article.count = 222;
}

conts article1 = new Article();

console.log(Article.count); // 222
console.log(article1.count); // 111
console.log(article1.__proto__.constructor.count); // 222 - вот он как глубоко
Ответ написан
evgeniy8705
@evgeniy8705
Повелитель вселенной
Article.count++; // Значение count будет одно для всех объектов созданных на основе Article, т.к как будет являться статическим и будет храниться в структуре самой функции конструкторе.
Article.result = this.created // Значение created будет оригинальным для каждого объекта созданного на основе Article, так как будет храниться в структуре самого объекта.

this.count++; // При таком раскладе count уже будет не статическим состоянием. Как и свойство created, будет находиться у каждого созданного объекта. При создание объектов, count  не будет накапливаться, а будет всегда равен %начальное значение count% + 1.
this.result = this.created


В общем тык
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы