javascript - 为什么私有(private)函数无法访问Javascript对象中的成员变量?

标签 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"

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

我怀疑这要么是 _controlName 和/或 Display3() 的定义方式存在问题,要么是我不清楚在这种情况下范围界定如何工作。有人可以分享一下这方面的情况吗?

谢谢,约翰

最佳答案

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

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

但是,当您分配给 Display3 时,您正在分配给全局变量。如果它不存在,则会为您创建。当您调用 new SampleObject("Fred"); 时,最初记录“Bob”的函数现在消失了,取而代之的是打印“Fred”的函数。

如果添加'use strict';在 SampleObject 函数的顶部,该函数抑制了这种“隐式全局”行为,当您尝试分配给从未声明的变量 Display3 时,您会收到引用错误。

关于javascript - 为什么私有(private)函数无法访问Javascript对象中的成员变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56351525/

相关文章:

javascript - PHP 的 imagefill() 问题

javascript - 在 angularJs 中显示数据的有效 JSON

Javascript - 停止幻灯片超时

javascript - 来自数据库jsp的依赖动态下拉列表

javascript - 如何在 Rails 应用程序中通过 javascript 引用 yaml 文件中的字符串?

javascript - history.go(-1) 不适用于 chrome。还有其他选择吗?

javascript - 类型错误 : Cannot read property 'nativeElement' of undefined in HTML5 Canvas with Ionic 2

javascript - Angular ngModel 绑定(bind)在 $scope 的一级方法上

javascript - 使用 CSS 转换/动画/等时,如果用户浏览器不执行 css 动画,回退到 jquery 的最佳方法是什么?

javascript - 触发 SublimeText 自定义片段时如何省略(或删除)自动匹配括号?