我以为我已经了解了闭包的思想,但是下面的代码
对于我来说表现出奇的是:

function A(x)
{
  this.getX1 = function () { return x; }
  A.prototype.getX2 = function () { return x; }
}
var a1 = new A(1);
var a2 = new A(2);
console.log ('a1.getX1()=%d', a1.getX1 ()); // 1
console.log ('a2.getX1()=%d', a2.getX1 ()); // 2
console.log ('a1.getX2()=%d', a1.getX2 ()); // 2 ???
console.log ('a2.getX2()=%d', a2.getX2 ()); // 2

我能理解原型(prototype)方法的行为是否不同于
实例方法,但这似乎x已成为静态变量。
更改通话顺序不会更改结果。

最佳答案

当您更改prototype时,您将更改function到给定类的所有实例,包括已经存在的实例。

因此,当您致电...

A.prototype.getX2 = function () { return x; }

您将其设置为a1的现有A实例。因此,有效的是,您得到了以下伪代码:
<all instances of A>.getX2 = function () {
    return <latest value of x passed to A constructor>;
}

09-16 22:48