一种getter语法有效,但另一种无效;t

One getter syntax works, but the other doesn't?

本文关键字:另一种 无效 getter 语法 有效 一种      更新时间:2023-09-26

为什么这个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语法之间的区别是什么?我应该在什么时候使用它们?

后一个例子有两个问题:

  1. 您引用的是不存在的变量x:JS不像C++、C#或Java那样只指定成员名称,但必须使用this引用来寻址。因此它必须是this.x

  2. 当您修复#1时,会出现第二个问题:堆栈溢出。

    Vector.prototype = {
        get x() {
            return this.x;
        }
    }
    

    这段代码定义了一个getter,它访问自己以返回一个值。这导致getter被调用,这样它就可以无限地再次调用自己。

    它的解决方案是为数据成员本身及其getter使用不同的名称(如this.xthis.x_

PS:准确地说,"这个getter语法不起作用"——这不是语法问题,因为代码在语法上是正确的。该问题出现在运行时,是代码逻辑的问题。