首页 > 代码库 > 关于原型链和作用域链的终点问题

关于原型链和作用域链的终点问题

 1 <script language="javascript" type="text/javascript">  2 function A(){ 3     this.a=11; 4     this.getA=function(){ 5         return this.a; 6     } 7 } 8 A.prototype.b=33; 9 Object.prototype.b=22;10 var k=new A()11 alert(k.b);//33;12 </script>            
 1 <script language="javascript" type="text/javascript">  2 function A(){ 3     this.a=11; 4     this.getA=function(){ 5         return this.a; 6     } 7 } 8 Object.prototype.b=22; 9 var k=new A()10 alert(k.b);//2211 </script>

  原型链的终点是Object.prototype,当一个访问一个对象的属性的时候,首先在它的构造函数里面去查询this定义的属性,如果找到相应的属性就立即终止查询,如果没有找到相应的属性,就沿着原型链一层一层的查找直到Object.prototype。例如上面的第一个例子访问对象K的属性b,首先查询构造函数下面的this定义的属性,没找到就到原型属性上去找,结果找到了属性b,这是查询终止而不会到Object.prototype;但是对于第二个例子,在构造函数和对象原型中都没找到,就找到了Object.prototype上,这就是原型链的终点,如果在Object.prototype(原型链的终点)上也没有查询到属性的话就会报错undefined。

  注意一个问题就是原型链上面的属性在用for-in loop的时候也会被循环到,所以要过滤掉原型属性的话可以采用

1 for (var key in obj){2   if(obj.hasOwnPropoty(key)){//过滤3     console.log(key+‘:‘+obj[key]);4   }5 }

或者:

1 for (var key in obj) {2    if (Object.prototype.hasOwnProperty.call(obj, key)) { // 过滤3       console.log(key+":"+obj[key]);4    }5 }

 

 1 <script language="javascript" type="text/javascript">  2 var c=1; 3 (function cc(){ 4     var d=2; 5     console.log(d);//dd输出2 6     return { 7         dd : function(){ 8             var e=3; 9             console.log(e);//dd输出310             console.log(d);//cc输出211             console.log(c);//global输出112         }    13     }14 })().dd();15 <script>

  作用域链的终点是全局对象window,首先来说在一个作用域里面首先访问的是作用域链的最里层,如上面的例子的dd函数里面的e,如果没有找到就沿着作用域链向外层查询,当然和原型链一样查询到了立即终止查询,直到查询到全局window的属性

关于原型链和作用域链的终点问题