Javascript:调用私有函数时对象上下文丢失

时间:2014-01-20 17:59:01

标签: javascript scope encapsulation

我现在正在测试一个简单的Javascript“类”。我注意到我的私有函数中的“this”并没有指向对象本身,而是指向全局范围(窗口)。

为什么?

信息:我想保持模式私有,所以我使用var模式而不是this.mode。 我还希望将两个内部函数保持为私有,因此用户无权访问它。 我基本上使用.prototype来向myStorage添加公共函数来访问私有成员。

我的代码:

var myStorage = function(mymode) {
    var mode = mymode;
    function privateFunctionA() {
      // access this.mode to read mymode from constructor but 
      // this is pointing to window
    };

    function privateFunctionB() {
      // access this.mode to read mymode from constructor but 
      // this is pointing to window
    };

    // check for indexeddb, websql and localstorage
    if(mymode == 'A') {
      privateFunctionA();
    } else {
      privateFunctionB();
    }
};
myStorage.prototype.publicFunc = function() {
  console.log(this.mode); // does this work?
}

var data = new myStorage();

2 个答案:

答案 0 :(得分:6)

this始终是JavaScript中的函数作用域(除非您使用call()apply()明确传入上下文。因此,在您的私有函数中,this不再引用与父作用域中的this相同。在JavaScript中处理此问题的惯用方法是将this分配给父作用域中的self var。例如,

var myStorage = function(mymode) {
    var self = this;
    var mode = mymode;
    function privateFunctionA() {
        console.log(self);
    };
    ...
};

关于此代码段:

myStorage.prototype.publicFunc = function() {
    console.log(this.mode); // does this work?
}

您需要在构造函数中将mode分配给this(而不是var)。因此,构造函数现在变为:

var myStorage = function(mymode) {
    var self = this;
    this.mode = mymode;
    function privateFunctionA() {
        // works
        console.log(self.mode);
    };
    ...
};

在这种情况下,this.mode也适用于.publicFunc()

作为一个更具风格的说明,JavaScript中的构造函数通常使用正确的驼峰大小写(即MyStorage)。

答案 1 :(得分:0)

我不认为你在使用原型时可以使用它来访问对象本身,因为范围发生了变化而你放松了对主要对象本身的引用,所以这就变成了窗口。

检查其他问题以获取更多信息:

Use of 'prototype' vs. 'this' in JavaScript?

希望这有帮助。