为什么这个getter语法在没有Object.defineProperty
的情况下有效?
var Vector = function(x, y) {
this.x = x;
this.y = y;
}
Vector.prototype = {
getX: function() {
return this.x;
}
}
var vector = new Vector(22, 1);
vector.x = 3;
alert(vector.getX());
这个getter语法不起作用(在JSFiddle和CodePen中)?
var Vector = function(x, y) {
this.x = x;
this.y = y;
}
Vector.prototype = {
get x() {
return x;
}
}
alert(new Vector(3, 4).x);
这些getter语法之间的区别是什么?我何时应该使用它们?
答案 0 :(得分:3)
后一个例子有两个问题:
您指的是不存在的变量x
:JS不像C ++或C#或Java那样只指定成员名称,但您必须使用this
引用地址它。所以它必须是this.x
修复#1时,会出现第二个问题:堆栈溢出。
Vector.prototype = {
get x() {
return this.x;
}
}
此代码定义了一个访问自身以返回值的getter。这会导致调用getter,以便它可以无限地再次调用自己。
它的解决方案是为数据成员本身及其getter使用不同的名称(如this.x
vs this.x_
)
PS:完全准确"这种getter语法不起作用" ---它不是语法问题,因为代码在语法上是正确的。问题出现在运行时,是代码逻辑的问题。