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


返回全文

                   

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值