//
<script type="text/javascript"> var Person = function() { }; Person.prototype.username = "zhangsan"; var person1 = new Person(); var person2 = new Person(); alert("实例创建后,person1.username: "+person1.username); alert("实例创建后,person2.username: "+person2.username); alert("向原型增加属性age前,person1.age: "+person1.age); alert("向原型增加属性age前,person2.age: "+person2.age); //向原型增加属性 Person.prototype.age = new String("18"); alert("向原型增加属性age后,person1.age: "+person1.age); alert("向原型增加属性age后,person2.age: "+person2.age); </script>
//
输出:
实例创建后,person1.username: zhangsan
实例创建后,person2.username: zhangsan
向原型增加属性age前,person1.age: undefined
向原型增加属性age前,person2.age: undefined
向原型增加属性age后,person1.age: 18
向原型增加属性age后,person2.age: 18
问题: 为什么向原型的增加属性后,2个实例person1,person2也增加了对应的属性呢?
假设1副本: N个实例创建时都持有原型的属性的副本,向原型增加age属性后,接着向N个实例都增加age属性,且值与原型一样(副本)
--要进行N次操作,可能性不高!
假设2引用: N个实例创建时都持有原型的属性的引用,向原型增加age属性后,接着向N个实例都增加age属性(引用),此时Person.prototype.age 和 person.age引用同一个对象String("18")
--要进行N次操作,可能性不高!
假设3固定查找方式:
N个实例创建时没有原型同名的属性,如person创建时,它自身并没有username属性!向原型增加age属性后,N个实例上同样没有age属性,当访问person1.age时,因为它自身并没有age属性,所以按照固定的查找方式来查找:
因为person1是Person的实例(person1 instanceof Person 得到的是true),所以查找Person.prototype.age的属性,如果没找到,继续向上一层原型查找,在这里,js引擎找到了Person.prototype.age属性,故输出!
--仅需修改prototype,然后按固定查找方式查找,能解译此例!
返回全文