Javascript: Cómo acceder a un atributo de clase desde una función dentro de una de las funciones de la clase

StackOverflow https://stackoverflow.com/questions/429487

  •  06-07-2019
  •  | 
  •  

Pregunta

Dentro de una determinada función de una clase, necesito usar setInterval para interrumpir la ejecución del código. Sin embargo, dentro de la función setInterval , " this " ya no se refiere a la clase "myObject". ¿Cómo puedo acceder a la variable " nombre " desde dentro de la función setInterval ?

function myObject() {
    this.name = "the name";
}

myObject.prototype.getName = function() {
    return this.name;
}

myObject.prototype.test = function() {
    // this works
    alert(this.name);

    var intervalId = setInterval(function() {
        // this does not work
        alert(this.name);

        clearInterval(intervalId);
    },0);
}
¿Fue útil?

Solución

myObject.prototype.test = function() {
    // this works
    alert(this.name);
    var oThis = this;
    var intervalId = setInterval(function() {
        // this does not work
        alert(oThis.name);

        clearInterval(intervalId);
    },0);
}

Esto debería funcionar. La función anónima '' esto '' no es lo mismo " esto " como su myObject's " this. "

Otros consejos

Aquí está la función de enlace del prototipo

Function.prototype.bind = function( obj ) {
    var _this = this;
    return function() {
        return _this.apply( obj, arguments );
    }
}

Para esto sirve el enlace en Prototype:

function myObject() {
    this.name = "the name";
}

myObject.prototype.getName = function() {
    return this.name;
}

myObject.prototype.test = function() {
    // this works
    alert(this.name);

    var intervalId = setInterval(function() {
        // this does not work
        alert(this.name);

        clearInterval(intervalId);
    }.bind(this),0);
}

Tenga en cuenta que la respuesta de s13james está incompleta porque bind () no es una característica estándar y debe proporcionarse en otro lugar: una forma es usar el marco de prototype.js Javascript, mientras que otra será hacer usted mismo usando el ejemplo de código de meouw.

Si no usa bind () (que es ingenioso, debo decir), entonces la respuesta de djangel es lo que podría haber hecho, y es lo que hago con más frecuencia.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top