Задать вопрос

Путаница с контекстом в JS

Пример кода:
var Container = function() {

this.classes = {"simple": "entry"};

this.get = function(name) {
return this.classes[name];
};

};

Почему в методе "get" не потерялся (не изменился на функцию ссылающуюся на [Container].get) контекст на this?
То есть, this.classes[name] - возвращает элемент объекта classes "класса" Container
Почему в методе "get": this - Container, this.classes - Object, а не this - анонимная ф-я (this.get), this.classes - undefined ?
  • Вопрос задан
  • 2513 просмотров
Подписаться 4 Оценить Комментировать
Решения вопроса 1
nazarpc
@nazarpc
Open Source enthusiast
Почитайте когда меняется this. В данном случае у вас создастся контекст когда вы выполните:
obj = new Container();
Так как this.get является методом и принадлежит Container - он наследует его контекст (в методе this это родительский объект).

Можете почитать подробнее: learn.javascript.ru/object-methods
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
@veontomo
Получается, что для вас было бы логично, что бы методы класса не имели доступа к другим методам того же класса?
Конструкция подобного рода имеет место быть во многих объектно ориентированных языках.
Ответ написан
Комментировать
@lega
Вы поместили classes и get в один объект через this (например выполнив: obj = new Container(); или obj = {}; Container.call(obj);)
Когда вы будете вызывать ф-ию таким образом: obj.get(), этот obj будет передан в ф-ию как this в котором лежат classes и get (потому что вы вызываете get как бы из obj).

Так же вы можете подменить (this) если вызовете метод через call/apply: obj.get.call({}, 'simple'), в таком случае вы получите "this.classes - undefined".
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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