Lo siento si esto ha sido respondido, pero no pude encontrar una búsqueda ... ¡creo que es algo difícil de buscar!

Digamos que tengo esto:

var MyPrototype = function() { this.init(); }
$.extend(MyPrototype.prototype, {
    a: 5,
    init: function() {
        var thing = new SomeOtherClass();
        thing.meth = this.meth;
        // thing.meth() is called somewhere within thing;
    },
    meth: function() {
        alert(this.a);
    }
}

Básicamente, estoy tratando con otra clase que usa sus propios métodos como devoluciones de llamada, p. Se espera que los anule con mi propia funcionalidad. Pero necesito conservar el alcance adecuado de this mientras lo hago (lo único que me importa de SomeOtherClass es lo que se pasa a la devolución de llamada; nada en el estado).

¡Como puede imaginar, esto no funciona porque thing no tiene propiedad a! Sin embargo, no estoy lo suficientemente familiarizado con las complejidades del alcance de Javascript para saber cómo hacer que this se refiera a lo que quiero.

2
tdavis 28 jul. 2009 a las 01:34

5 respuestas

La mejor respuesta

Combinando otras dos respuestas aquí, para que no tenga que reescribir su función de metanfetamina, haría esto:

    var me = this;
    thing.meth = function() {
        MyPrototype.meth.apply(me, arguments);
    };
2
edsoverflow 27 jul. 2009 a las 22:04

¿Qué tal:

thing.meth.call(this);

O

thing.meth.apply(this);

(La única diferencia está en cómo se pasan los argumentos, lo que no importa en este caso).

-1
Tim Sylvester 27 jul. 2009 a las 21:38

Como no puedes controlar cómo se llama, puedes probar esto:

var MyPrototype = function() { this.init(); }
$.extend(MyPrototype.prototype, {
    a: 5,
    init: function() {
        var thing = new SomeOtherClass();

        // Create an aliad for this
        var that = this;
        thing.meth = function() {
            // You can always access the object using it's "that" alias
            alert(that.a);
        };
    }
}

O...

var MyPrototype = function() { this.init(); }
$.extend(MyPrototype.prototype, {
    a: 5,
    init: function() {
        var thing = new SomeOtherClass();

        // Create an aliad for this
        var that = this;
        thing.meth = function() {
            // You can always access the object using it's "that" alias
            that.meth();
        };
    },
    meth: {
        alert(this.a);
    }
}
1
Chris Pietschmann 27 jul. 2009 a las 21:57

¿Podrías hacer algo como esto?

var MyPrototype = function() { this.init(); }
$.extend(MyPrototype.prototype, {
    a: 5,
    init: function() {
        var thing = new SomeOtherClass();
        var self = this;
        thing.meth = function(){this.meth.apply(self)};
        // thing.meth() is called somewhere within thing;
    },
    meth: function() {
        alert(this.a);
    }
}
-1
agilefall 27 jul. 2009 a las 21:56

Antes del comienzo de su ejemplo de código, agregue esta línea:

var self = this;

Luego, reemplace todos los usos de 'this' en su código con 'self'.

(Creo que muchas de las respuestas a esto dicen más o menos lo mismo).

0
aem 27 jul. 2009 a las 22:06