我的班级原始版本(没有下划线)出现了最大堆栈大小错误,当我查找它时,最终看到了一些示例,其中包括在getter /中引用该类属性时添加一个下划线/二传手在不喜欢其他任何建议之前,我只是添加了下划线并运行了该程序,仅此一项就解决了问题。这是如何运作的?在这种情况下,下划线是做什么的?据我了解,这可以防止堆栈超载以递归的无限循环方式反复调用setter,但是添加下划线如何实现此目的?
供参考,我在Node.js应用程序中使用ES6语法。
原件:
set serialNumber(serialNumber) {
this.serialNumber = serialNumber;
}
更正:
set serialNumber(serialNumber) {
this._serialNumber = serialNumber;
}
没有特殊含义,但是使属性名称与众不同。
设置程序set serialNumber
处理调用以设置serialNumber
属性。如果您尝试在设置器中设置相同的属性,则该设置器将递归调用自身,并且永远不会终止。
这是用于在类中使用的命名“私有”数据属性的众多约定之一,但对JS运行时没有特殊的意义。
下划线本身不执行任何操作。没有特别的意义。它所做的只是创建一个不同名称。现在,您无需将值设置为serialNumber
,而是将其设置为_serialNumber
。这只是一个不同的名称。
这对您的特定情况意味着您是不递归地呼叫您的设定者。 this.serialNumber = ..
调用设置程序set serialNumber
。然后调用设置程序set serialNumber
。然后调用设置程序set serialNumber
。然后调用设置程序set serialNumber
。无限广告…
setter方法内部对属性的分配与外部方法没有不同的处理。因此,如果设置器尝试分配与设置器名称相同的属性,它将再次调用设置器,从而导致无限递归。
要解决此问题,设置者必须设置其他属性。下划线前缀只是将内部属性名称与可见属性区分开的通用命名约定。
您非常了解:)
_与逻辑没有关系,只是一种表示法。
用户_,不带下划线的私有变量和属性名称,例如年龄,性别
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 }
}
希望它将帮助您理解_的概念。