Javascript:使用setTimeout时对象的封装

时间:2011-10-14 20:28:53

标签: javascript settimeout

如何使用 setTimeout 这样的函数来调用对象的成员函数,并在被调用函数中使用 this 关键字?

请联系我的来源。我通过使用Javascript 闭包变量来模拟这个。在我的情况下,被称为函数的参数 context 实际上 this 对象 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

2 个答案:

答案 0 :(得分:1)

如果您尝试隐藏传统OOP的传统私人成员,请使用以下内容:

    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);
        };
    }

答案 1 :(得分:1)

好的,我不明白这个问题,这是经过一些修改后的代码:

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();

告诉我你的想法。