JavaSctipt之prototype原型深入分析: prototype的属性是副本,引用,还是固定的查找方式?(2)增加prototype的属性

JavaSctipt之prototype原型深入分析: prototype的属性是副本,引用,还是固定的查找方式?
                                      ----02_增加prototype的属性

//

<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,然后按固定查找方式查找,能解译此例!


返回全文

                   

你可能感兴趣的:(String,function,prototype,js引擎)