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

标签 javascript scope encapsulation

<分区>

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

为什么?

信息:我想保持模式私有(private),所以我使用 var 模式而不是 this.mode。 我还想将两个内部函数都保密,这样用户就无法访问它。 我基本上使用 .prototype 将公共(public)函数添加到 myStorage 以访问私有(private)成员。

我的代码:

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

最佳答案

this 在 JavaScript 中始终是函数作用域(除非您使用 call()apply() 显式传入上下文。因此,在您的私有(private)函数中,this 不再引用与父作用域中相同的 this。在 JavaScript 中处理 this 的惯用方法是分配 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)。

关于Javascript:调用私有(private)函数时对象上下文丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21240976/

相关文章:

javascript - Arduino JSON over Serial,Json.Parse 返回意外的 JSON 输入

c++ - 继承时的作用域规则 - C++

scope - 虽然没有全局

c++ - 为可维护性和封装性构建 C++ 类层次结构

Java 封装 setter 不改变实例变量

javascript - 从 url 获取值

javascript - jQuery:IE7 上的实时更改事件

javascript - 如何用python创建highcharts格式的json结构

javascript - 在 for 循环中使用 onclick 事件时如何解决范围问题

java - 如何处理与微服务无关的类对象?