Javascript: инкапсуляция объекта при использовании setTimeout - PullRequest
0 голосов
/ 15 октября 2011

Как использовать такие функции как setTimeout для вызова функций-членов объектов с использованием this ключевое слово внутри вызываемых функций?

Посмотрите на мой источник, пожалуйста.Я имитирую это с помощью переменных JavaScript closure .В моем случае вызываемая функция имеет аргумент context , который на самом деле это для объекта o :

    var Utils = 
    {
        Caller: function( context, func )
        {
            var _context = context;
            var _func = func;

            this.call = function()
            {           
                _func( _context );
            };

            return this;
        }
    };

// example of using:

function Object()
{
    this._s = "Hello, World!";
    this.startTimer = function()
    {
        var caller = new Utils.Caller( this, this._hello );
        setTimeout( caller.call, 1000 );
    };
    this._hello = function( context )
    {
        alert( context._s );
    }
}

var o = new Object();
o.startTimer();

Возможно ли сохранить обычноеобъявление функции _hello () и использование ключевого слова this , но не использовать context inside?

Ответы [ 2 ]

1 голос
/ 15 октября 2011

Хорошо, я не понял вопроса, вот код после некоторых модификаций:

var Utils = {
    Caller: function ( context, func ) {
        this.exec = function () {
            func.call( context );
        };
    }
};

function Obj() {
    this._s = 'Hello, World!';

    this._hello = function () {
        alert( this._s );
    }

    this.startTimer = function () {
        var caller = new Utils.Caller( this, this._hello );
        setTimeout( caller.exec, 1000 );
    };  
}

var o = new Obj();
o.startTimer();

Скажите, что вы думаете.

1 голос
/ 15 октября 2011

Если вы пытаетесь скрыть традиционный закрытый член от классического ООП, используйте следующее:

    function MyObj() {

        // setup private closure scope
        var that = this;  // keep reference to this in constructor closure scope
        var s = "Hello, World!";
        var hello = function() {
            alert(s);
        };

        // expose public methods  
        this.startTimer = function() {
            setTimeout(function() {
                hello();
            }, 1000);
        };
    }

    var o = new MyObj();
    o.startTimer();

Другой подход:

    function MyObj() {
        var that = this;
        this._s = "Hello, World!";
        this._hello = function() {
            alert(this._s);
        };
        this.startTimer = function() {
            setTimeout(function() {
                hello.call(that);
            }, 1000);
        };
    }
...