javascript - Javascript 类为什么/如何通过在它们之前加上下划线前缀来访问它们自己的值?

标签 javascript

我发现在一个教程中找到了一个类,它允许 getter 和 setter 函数访问构造函数中名为 visible set 的字段,该字段与 getter/setter 具有相同的名称,通过前缀下划线。这里发生了什么?为什么这行得通,难道 getter/setter 函数不应该因为字段名称不正确而无法找到它吗?

class WeirdClass {
        constructor() {
            this.visible = false;
        }
        get visible() {
            return this._visible;
        }
        set visible(v) {
            this._visible = v;
        }
    }

最佳答案

想象一下,如果在没有 _visible 的情况下我们直接从 getter 和 setter 访问 this.visible:

class WeirdClass {
     constructor() {
         this.visible = false;
     }
     get visible() {
         return this.visible; //calls the getter recursively
     }
     set visible(v) {
         this.visible = v; //calls the setter recursively
     }
}

这里没有_visible,我们在所有情况下都访问this.visible。在这种情况下,当您访问 WeirdClass 实例上的 visible 属性时,它将触发 getter,后者将尝试访问 this.visible 将再次调用 getter 的属性,这将导致无限递归。

为了防止这种情况发生,他们在实例上创建了一个 _visible 属性,这样当您从 WeirdClass 实例访问 visible 属性时它不会导致无限递归并实际上通过 getter/setter 访问另一个属性 _visible

事实上,如果您尝试实例化 WeirdClass,它甚至不会让您:

class WeirdClass {
     constructor() {
        this.visible = false;
     }
     get visible() {
        return this.visible; //calls the getter recursively
     }
     set visible(v) {
        this.visible = v; //calls the setter recursively
     }
}
//Uncaught RangeError: Maximum call stack size exceeded
const weirdClass = new WeirdClass();

这是因为构造函数试图在 this.visible 中设置 false,这会递归地触发 setter。

关于javascript - Javascript 类为什么/如何通过在它们之前加上下划线前缀来访问它们自己的值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57870530/

相关文章:

javascript - 数据库条目(缩略图)周围的随机颜色边框(Javascript)

javascript - new Date() - Angular 2

javascript - 如何构建源代码以使其占用更少的空间?

javascript - 多个 attr() 仅在 jquery 中部分工作

javascript - 推送 intel-xdk 文件后,Pixi.js 触摸事件未在 iPhone 上触发

Javascript 代码无法在使用 AJAX 加载的 PHP 页面上运行

javascript - Angular JS Javascript 动画淡入不适用于新添加的项目

javascript - 如何调试nodejs readline应用程序?

javascript - jquery 偏移量增加 .hide() 上的先前值

javascript - 为什么 (-2.4492935982947064e-16).toFixed(5) 等于 "-0.00000"?