为什么私有函数不能访问Javascript对象中的成员变量?

时间:2019-05-29 00:13:42

标签: javascript

我在理解用JavaScript对象定义的字段的作用域/访问方面遇到问题。

请考虑以下示例JavaScript对象定义:

function SampleObject(controlName) {

    var _controlName = controlName;

    this.Display1 = function() {
        console.log(_controlName);
    }

    this.Display2 = function() {
        Display3();
    }

    Display3 = function () {
        console.log(_controlName);
    }
}

现在考虑使用以下示例运行上述对象:

var a = new SampleObject("Bob");
var b = new SampleObject("Fred");

a.Display1();  //==> Displays "Bob"
b.Display1();  //==> Displays "Fred"

a.Display2();  //==> Displays "Fred"
b.Display2();  //==> Displays "Fred"

我很难理解的是如何从我的对象中定义的私有函数中访问对象字段(属性)。 在我的示例中,对于两个对象通过 Display2()显示的 _controlName 为什么具有值“ Fred ”的原因,我感到困惑strong> a 和 b

我怀疑这与_ controlName 和/或 Display3()的定义方式有关,或者我不清楚在这种情况下作用域如何工作。有人可以分享一下这个观点吗?

谢谢JohnB

2 个答案:

答案 0 :(得分:2)

在其他一些语言中,例如Java(我来自那里),当您在对象的方法内部时,this是隐式的。在Javascript中,情况并非如此。

当您分配给this.Display1this.Display2时,您正在使用this所指向的对象上的名称创建属性。由于new,每次都是一个不同的对象。

但是,当您分配给Display3时,您正在分配的是全局变量。如果不存在,则会为您创建。当您调用new SampleObject("Fred");时,原来登录“ Bob”的功能现在已消失,由打印“ Fred”的功能代替。

如果您添加“使用严格”;在您的SampleObject函数的顶部(它抑制了这种“隐式全局”行为),当您尝试将其分配给从未声明的变量Display3时,会出现参考错误。

答案 1 :(得分:1)

这是解释。

在第一次调用中,new SampleObject("Bob");全局变量Display3被设置为控制台记录值Bob的函数。

在第二个调用中,将new SampleObject("Fred");全局变量Display3设置为控制台记录值Fred的函数。

现在您的Display1实际上是一种方法。您创建的每个对象都有其自己的Display1属性。因此,鲍勃的Display1日志Bob和弗雷德的日志Fred

但是因为Display2方法每个都调用全局Display3方法,所以它们会全部记录Display3的最后一次分配中记录的功能,并且始终为Fred