JavaScript - функции объекта, ссылающиеся на его поля - PullRequest
0 голосов
/ 09 сентября 2011

Вот (очень) упрощенная версия моего кода:

    function Ctor() {
        this.i = 0;

        this.increment = function() { this.i++; },
        this.decrement = function() { this.i--; },

        this.display = function() { alert(this.i); }
    };

Проблема в том, что при запуске кода при некоторых обстоятельствах this теперь указывает на что-то другое.Я более или менее понимаю, что this меняет контекст с одной функции на другую, но я думаю, что моя функция приращения (и другие), с помощью магии замыканий, "помнит", что это должно быть.

Я попытался просто полностью устранить это и просто сослаться на i в функциях.Это также не удалось.

Как должны выглядеть эти функции?

Ответы [ 2 ]

3 голосов
/ 09 сентября 2011

Вы не можете полагаться на то, что в this в JavaScript. Подробнее по этой теме .

Я вижу, вы, вероятно, хотите ввести личные атрибуты, как в языках ООП. Джон Резиг очень хорошо описал эту проблему .

function Field(val){
    var value = val;

    this.getValue = function(){
        return value;
    };

    this.setValue = function(val){
        value = val;
    };
}

var field = new Field("test");
field.value
// => undefined
field.setValue("test2")
field.getValue()
// => "test2" 

JavaScript работает совсем не так, как обычные языки, такие как Java, C ++ или PHP. Но к этому можно привыкнуть:)

1 голос
/ 09 сентября 2011

В случаях, когда this изменяется, вы можете сделать это:

function() { obj.display(); }

Пример:

var obj = new Ctor();

function foo(fn) {
    fn();
}

foo(function() {
    obj.display();
});

Альтернативой является изменение foo () для принятия контекставыполнить функцию с помощью:

function foo(fn, context) {
    fn.call(context);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...