ES6类getter或setter中的属性名称前的下划线(_)是做什么的?

问题描述 投票:-1回答:4

我的班级原始版本(没有下划线)出现了最大堆栈大小错误,当我查找它时,最终看到了一些示例,其中包括在getter /中引用该类属性时添加一个下划线/二传手在不喜欢其他任何建议之前,我只是添加了下划线并运行了该程序,仅此一项就解决了问题。这是如何运作的?在这种情况下,下划线是做什么的?据我了解,这可以防止堆栈超载以递归的无限循环方式反复调用setter,但是添加下划线如何实现此目的?

供参考,我在Node.js应用程序中使用ES6语法。

原件:

    set serialNumber(serialNumber) {
        this.serialNumber = serialNumber;
    }

更正:

    set serialNumber(serialNumber) {
        this._serialNumber = serialNumber;
    }
javascript es6-class
4个回答
0
投票

没有特殊含义,但是使属性名称与众不同。

设置程序set serialNumber处理调用以设置serialNumber属性。如果您尝试在设置器中设置相同的属性,则该设置器将递归调用自身,并且永远不会终止。

这是用于在类中使用的命名“私有”数据属性的众多约定之一,但对JS运行时没有特殊的意义。


0
投票

下划线本身不执行任何操作。没有特别的意义。它所做的只是创建一个不同名称。现在,您无需将值设置为serialNumber,而是将其设置为_serialNumber。这只是一个不同的名称。

这对您的特定情况意味着您是不递归地呼叫您的设定者this.serialNumber = ..调用设置程序set serialNumber。然后调用设置程序set serialNumber。然后调用设置程序set serialNumber。然后调用设置程序set serialNumber。无限广告…


0
投票

setter方法内部对属性的分配与外部方法没有不同的处理。因此,如果设置器尝试分配与设置器名称相同的属性,它将再次调用设置器,从而导致无限递归。

要解决此问题,设置者必须设置其他属性。下划线前缀只是将内部属性名称与可见属性区分开的通用命名约定。


0
投票

您非常了解:)

_与逻辑没有关系,只是一种表示法。

用户_,不带下划线的私有变量和属性名称,例如年龄,性别

class Person {
  private _age: number;
  private _gender: string;

  get age() { return this._age }
  set age(personAge: number) { this._age = personAge }

  get gender() { return this._gender }
  set age(personGender: string) { this._gender = personGender }
}

希望它将帮助您理解_的概念。

© www.soinside.com 2019 - 2024. All rights reserved.