Jak uniknąć „tego” odnoszącego się do elementu DOM i odnosić się do obiektu
Mam problem, że nie mogę się obejść.
Kontekst jest następujący: Chcę mieć łańcuch dziedziczenia, a metoda obiektów należących do tego dziedziczenia musi być procedurą obsługi zdarzeń, a jednocześnie być w stanie dotrzeć do właściwości obiektu.
Próbuję napisać JavaScript bez „nowego” słowa i zamiast tego użyć Object.create () z pewną hierarchią dziedziczenia. Więc najpierw to podejście.
Tak więc mam projekt reszty moich obiektów (myProto), a następnie tworzę obiekty za pomocą Object.create (tak, że nie ma zamknięcia, w którym mogę wykonać sztuczkę przypisywaniathis
dothat
lubself
). Teraz, gdy używam metody tego obiektu do obsługi, na przykład, zdarzenia kliknięcia w div,this
oczywiście będzie odnosić się do obiektu DOM i tracę możliwość dostępu do właściwości mojego obiektu.
var myProto = {
init: function (name, value) {
this.name = name;
this.value = value;
return this;
},
someHandler: function (e) {
// Normally I would use this instead of e.target...
e.target.innerHTML = this.name + this.value; // This does not refer to the object.
}
};
var myObject = Object.create(myProto).init('myName', 'myValue');
document.getElementById('myDiv').onclick = myObject.someHandler;
Oto skrzypce:http://jsfiddle.net/pgPHM/
A teraz podejście „klasyczne”: Gdybym używał nowej formy Konstruktora, łatwo byłoby przypisać to do zamknięcia, a następnie uzyskać do niego dostęp, ale istnieje problem, że funkcje w Constructor.prototype
var Constructor = function (name, value) {
var self = this;
self.name = name;
self.value = value;
};
Constructor.prototype.someHandler = function () {/*self does not reach this here*/};
jsfiddle:http://jsfiddle.net/ZcG3J/2/
Naprawdę nie rozumiem, dlaczego obiekty JS nie mają prawdziwegothis
lubself
lub cokolwiek, co odnosi się do nich bez tych trudnych kontekstów, zamknięć itd ...
Zasadniczo pytanie brzmi:
Jak mogę użyć metody obiektu jako procedury obsługi zdarzeń i nadal być w stanie dotrzeć do obiektu?