好了,经过研究理解,我来自问自答了,可能答的完全不对,但我尽力了。如有问题请各位大神指出。谢谢
为什么会输出两次C?
首先创建person1对象 var person1 = new Person("A")
调用Person 构造函数 对 Person的 prototype原型对象添加了2个方法(getName,setName),并将name 设置为"A",由于将对象属性指向了嵌套函数产生了闭包特性,这两个方法能随时读取或写入Person函数当前实例的 name 和 age 变量。
创建出的person1 对象是个空对象{},将他的[[proto]]指向 Person的 prototype对象
然后创建person2 对象 var person1 = new Person("B")
再次 调用Person 构造函数 ,但由于Person的 prototype已经有了 getName方法,所以不做任何事,只是创建出的person2 空对象{},并将他的[[proto]]指向 Person的 prototype对象。由于没有闭包,函数结束后这次函数实例的 name 和 age 变量被销毁。
然后调用 person1.setName(“C")
person1 不存在setName属性,通过proto链 找到 Person.prototype 存在 setName 方法,
执行后该闭包内的 name 设置为"C"
person2.getName 同理 通过proto链 找到 Person.prototype 存在 getName 方法,找到闭包的name("C")并读取。
person1.getName 同理找到闭包的name("C")并读取。