我以为我已经了解了闭包的思想,但是下面的代码
对于我来说表现出奇的是:
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>;
}