Как известно, в JS this не привязывается к объекту, а зависит от контекста вызова.
Если функция вызывается как свойство объекта, this в ней будет указывать на объект, вызвавший её, в отличных случаях this == window, а если указан строгий режим ("use strict"), то и вовсе this === undefined.
Так как внутре array.prototype.forEach() функция вызывается независимо от объекта, то и получается, что у Вас контекст в ней равен, так как не установлен строгий режим, window.
Распространенной практикой является сохранение нужного контекста в отдельной переменной:
var me = this;
var self = this;
var that = this;
Бывает удобно использовать его именно так, ведь тогда можно делать с этим контекстом что угодно и где угодно, не задумываясь, что же будет значить this в этой ситуации (надо будет только подумать в самый первый раз, выполнив это присвоение).
Тогда в Вашем случае можно написать так:
function TRoute(attributes) {
var me = this;
me.waypoints = [];
attributes.waypoints.forEach(function(waypoint_text, i){
me.waypoints.push({text: waypoint_text})
});
};
Однако, если у функции есть возможность передать контекст вызова, а у Array.prototype.forEach() она есть, то надо использовать её:
attributes.waypoints.forEach(
function(waypoint_text, i){
this.waypoints.push({text: waypoint_text})
},
me
);
надо использовать её... Так в результате и сделал. А не подскажите, почему это лучше, чем с
– installero Oct 23 '15 at 11:14me?