理解闭包_javascript原型链

作用域链(继承体现)

 

Js代码  
  1.      
  2. function MyOne( number ) {  
  3.      this.number = number;  
  4. }  
  5. function MyTwo( name ) {  
  6.      this.name = name;  
  7. }  
  8.   
  9. MyTwo.prototype = new MyOne( 8 );  
  10. var test = new MyTwo( "HuJin" );  
  11.   
  12. alert( test.__proto__.hasOwnProperty( "constructor" ) ); // false  
  13. alert( var val = test.name ); // "HuJin"  
  14. alert( var val = test.number ); // 8  

 
 

自己的思考

alert( test.name )的查找顺序为:

1. if( test.hasOwnProperty( "name" ) ) // Yes

2. var val = test.name // val = "HuJin"

3. alert(val);

 

输出结果:

 

alert( test.number )的查找顺序为:

1. if( test.hasOwnProperty( "number" ) ) // No

2. then 查找 test的原型 new MyOne( 8 ),因为test的构造函数 new MyTwo()的原型对象是一个MyOne的实例

   代码相当于:

   else if( test.__proto__.hasOwnProperty( "number" ) ) // Yes

3. var val = test.__proto__.number // val = 8;如果仍然找不到number属性,则继续向原型链上方走

4. else if( test.__proto__.hasOwnProperty( "number" ) ) // No

5. then if( test.__proto__.__proto__.hasOwnProperty( "number" )) // Yes

    then val = test.__proto__.__proto__.number // 这时test.__proto__.__proto__应该指向MyOne.prototype

   验证一下 : alert(test.__proto__.__proto__ === MyOne.prototype) // 神奇般的对了,参照上面的图

 

输出结果:

6. 如果还是找不到

    if( test.__proto__.__proto__.hasOwnProperty( "number" )) // No 那么继续向上走,也就是从MyOne.prototype向上走,也就到了Object对象了。

 

Extra:

我们在Object.prototype上增加一个奇怪的"monk"属性,然后调用 alert( test.monk )测试一下,看看是否会继续往上找...

Js代码 

Object.prototype.monk = "Pray";   function MyOne(number) {        this.number = number;   }   function MyTwo(name) {        this.name = name;   }      MyTwo.prototype = new MyOne(8);   var test = new MyTwo("HuJin");      alert(val = test.monk);  

 

输出结果:
 

 

该告一段落了。如果在Object.prototype中还是查找不到,那么undefined就弹出来了。也就是说访问不存在的属性,会一直遍历整个原型链。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值