未捕获的类型错误:无法设置#的属性playerNo,该属性在第4行只有一个getter
Uncaught TypeError: Cannot set property playerNo of # which has only a getter on line 4
我正在从使用旧的(函数和原型)的破解JavaScript类转移到新的ES6类。
我可能在做一些愚蠢的事情,但我不确定为什么不允许我这样做:
class Player{
constructor(playerNo){
this.playerNo = playerNo;
}
get playerNo(){
return this.playerNo;
}
set cards(playersCards){
this.cards = playersCards;
}
get cards(){
return this.cards;
}
}
var steve = new Player(1);
它给了我错误:Uncaught TypeError: Cannot set property playerNo of # which has only a getter on line 4
所以,我尝试了以下方法:
class Player{
constructor(playerNo){
this.playerNo = playerNo;
}
set playerNo(no){
this.playerNo = no;
}
get playerNo(){
return this.playerNo;
}
set cards(playersCards){
this.cards = playersCards;
}
get cards(){
return this.cards;
}
}
var steve = new Player(1);
这给了我:Uncaught RangeError: Maximum call stack size exceeded on line 6
(这是线this.playerNo = no;
)。
有什么想法吗?
您可以通过设置playerNo
进行递归。
在playerNo
设置器中,尝试设置this._playerNo = 0
。
在代码的其余部分中,继续区分setter方法的名称和存储数据的内部属性。
您可以使用getter作为"受保护"属性的手段,该属性只能从外部读取,并且没有setter。。。
但是,在代码中,您试图调用一个不存在的setter this.playerNo = playerNo
,而在getter中,您递归地引用了同一个getter return this.playerNo
,而不是在其中使用隐藏的this._playerNo
属性(在构造函数中也是如此),因此出现了堆栈溢出错误。
请记住,对于getters/ssetter,您需要一些额外的存储来实现您的价值,例如私有_playerNo
属性(除非您将存储委派到其他地方)。
您可能会感到奇怪,但在某些用例中"重新定义getter";作为"属性,其中固定值";旨在:
例如,实例化重物按需
- 一旦访问了getter,我们就将其重新定义为属性和值
- 下一次访问只返回属性中的值(如缓存…)
let a = 10;
let b = 10;
class Player {
get clubHistory() {
return Object.defineProperty(this, 'clubHistory', {
value: `clubHistory ➜ ${++b}`
}).clubHistory;
}
static get team() { // … first ivoce Player.team …
return Object.defineProperty(this, 'team', { // … re-defines static getter 'team' as property …
value: `team ➜ ${--a}` // … e.g. new Team(..)
}).team; // … return new value (only relevant for first call)
}
}
let player1 = new Player();
console.log('player1', player1.clubHistory); // 11 from get
console.log('player1', player1.clubHistory); // 11 from prop
let player2 = new Player();
console.log('player2', player2.clubHistory); // 12 from get
console.log('player2', player2.clubHistory); // 12 from prop
console.log(Player.team); // 9 from static get
console.log(Player.team); // 9 from static prop
console.log('player1', player1.constructor.team); // 9 from static prop
console.log('player2', player2.constructor.team); // 9 from static prop
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- 全局变量和全局对象的属性之间有什么区别吗
- 如果使用 lodash 将属性存在于另一个对象中,则向对象添加属性
- 如何在Bootstrap Modal中为动态点击生成的变量设置jade属性
- 序列化数据属性中对象的最可靠方法
- 分析高度属性时出现意外值{{specs.height}}.index.html
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- AngularJS-使用'true'属性
- 可以't使用JavaScript获取width属性
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 如何使用javascript获取嵌套对象中所有子对象的单个属性
- JavaScript Pub/Sub属性访问问题
- 从JavaScript访问struts操作中的属性
- 是否可以从父类访问子类的属性
- 如何更改reactjs中外部/独立组件的状态或属性
- 如何在选项卡上定义属性'的主窗口对象
- 锚点元素的href属性自动更改
- jQuery最近父级的数据属性选择器
- 未捕获的类型错误:无法设置#的属性playerNo,该属性在第4行只有一个getter