1.问题描述
看代码以及执行结果能够更好滴说明问题
- 代码及执行结果
<script>
function A(par)
{
var i = par ;
A.prototype.getI = function ()
{
return i ;
}
}
function B()
{
var a1 = new A(1);
var a2 = new A(2);
console.log(a1.getI());
console.log(a2.getI());
}
B() ;
</script>
期待结果: 输出 1,2
实际结果: 输出 2,2
- 疑问
i存在于每个实例中,保存了不同的值。
但是通过原型函数返回的是最后一个实例的i值。
这是为什么?
- 猜测
有朋友说原型函数中i实际是引用,因为原型函数被定义在了构造器中,因此每次实例化,i的引用都会被更行,因此它指向了最后一个实例中的i的值。我没有在网络上查到确切的说明。但是该解释可以被理解
这个问题极好!你需要理解如下知识
如果没时间请阅读这篇文章 closure for fun
如果有时间请阅读 Dmitry Soshnikov 理解 js 系列
导致这个问题的原因是这个现象 闭包作用域的共享
那么解决手段有两种
此外对于引用类型理解,参看 Nicholas.C.Zakas 大作
The Principles of Object-Oriented JavaScript 第一章
你如果想实现类似 c++ 的权限控制,必须理解闭包.或者采用
_xx
这种约定方式编写.给一个实现私有化的范例函数.