模块模式和范围

时间:2013-06-14 00:33:12

标签: javascript prototype module-pattern

我正在尝试创建可以继承并具有一些公共属性的封装对象。这是一些代码:

var MyObject = (function()
{
    function myObject()
    {
        //Public variables
        this.publicVar1 = 'hello';
        this.publicVar2 = 'world';
    }

    function foo()
    {
        console.log(this.publicVar1 + ' ' + this.publicVar2);
    }

    function bar()
    {
        foo();
    }

    //Public API
    myObject.prototype = {
        constructor: myObject,
        foo: foo,
        bar: bar
    }

    return myObject;

})();

var mo = new MyObject();
mo.foo(); //hello world
mo.bar(); //undefined undefined

我的问题为什么mo.bar()log'undefined undefined'究竟是什么?我该如何解决这个问题呢?

我正在尝试将publicVar1和publicVar2保留在MyObject模块的内部范围内,但也使它们可以公开访问并由扩展myObject原型的任何其他对象继承。

感谢。

1 个答案:

答案 0 :(得分:0)

当bar调用foo()时,它调用的函数不是任何对象的成员,该函数中的“this”关键字指的是窗口对象。

这样可行:

function bar()
{
    this.foo();
}

修改

对于试图理解范围的人来说,您的代码可能很容易被误解。请记住,当您调用mo.foo()和mo.bar()以及this.foo()(在bar函数内)时,您指的是您在原型上声明的属性,而不是函数的名称你已经在模块中声明了。巧合的是,它们碰巧是同一个名字。

下面的代码会更好地说明它:

var MyObject = (function()
{
    function myObject()
    {
        //Public variables
        this.publicVar1 = 'hello';
        this.publicVar2 = 'world';
    }

    function moduleFooFunction()
    {
        console.log(this.publicVar1 + ' ' + this.publicVar2);
    }

    function moduleBarFunction()
    {
        this.foo();
    }

    //Public API
    myObject.prototype = {
        constructor: myObject,
        foo: moduleFooFunction,
        bar: moduleBarFunction
    }

    return myObject;

})();

var mo = new MyObject();
mo.foo(); //hello world
mo.bar(); //undefined undefined