一种 getter 语法有效,但另一种无效?

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

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

后一个例子有 2 个问题:

  1. 您指的是不存在的变量x:JS 不像 C++ 或 C# 或 Java 那样工作,您只需指定一个成员名称,但您必须使用this 参考地址。所以一定是this.x

  2. 修复 #1 后出现第二个问题:堆栈溢出。

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

    此代码定义了一个 getter,它访问自身以 return 一个值。这会导致 getter 被调用,以便它可以再次无限地调用自己。

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

PS:准确地说"And this getter syntax doesn't work" --- 这不是语法问题,因为代码在语法上是正确的。问题出现在runtime,是代码逻辑的问题