En el siguiente objeto, tengo un problema al usar la referencia 'esto':
function SampleObject(){ this.addObject = function(object){...} ... // more code here ... this.addNewObjects= function(arr){ arr.forEach( function (obj) { this.addObject(new Obj(obj.prop1, obj.prop2)); }); } }Supongo que el contexto está cambiando y que 'esto' se refiere al 'obj' iterado, y no a 'SampleObject'. Resolví el problema usando un bucle for normal, sin embargo, tengo curiosidad por saber por qué esto no funciona y me gustaría saber si hay otra forma de hacerlo.
Puede almacenar esto en la variable:
var self = this; this.addNewObjects = function(arr){ arr.forEach(function(obj) { self.addObject(new Obj(obj.prop1, obj.prop2)); }); }o usa enlazar:
this.addNewObjects = function(arr) { arr.forEach(function(obj) { this.addObject(new Obj(obj.prop1, obj.prop2)); }.bind(this)); } Y nota al margen, sin ellos, this será un objeto de ventana, no obj. This es siempre un objeto que se creó usando una palabra clave nueva o un objeto de ventana si es una función normal. En modo estricto this será indefinido en este caso.
ACTUALIZACIÓN : y con ES6 puede usar la función de flecha:
this.addNewObjects = function(arr) { arr.forEach((obj) => { this.addObject(new Obj(obj.prop1, obj.prop2)); }); } Las funciones de flecha no tienen su propio this y lo obtienen del alcance externo.
ACTUALIZACIÓN2 : del comentario de @viery365 puede usar esto como segundo argumento para forEach y creará contexto para la función:
this.addNewObjects = function(arr) { arr.forEach(function(obj) { this.addObject(new Obj(obj.prop1, obj.prop2)); }, this); }Puedes leer esto en MDN para cada página
const array1 = [ {name : "john", age: 20}, {name : "sarah", age: 70} ]; array1.forEach(element => this.print(element)); print = (data) => { console.log(data.name); } // expected output: "john" // expected output: "sarah"Hay una mejor manera de hacer esto
array.forEach(obj => this.functionName(params));