IT不死旗下博客隆重开通啦,欢迎各位小伙伴们来围观 。

详解Javascript中的原型链

Javascript Xueqi 922℃ 0评论

原型链的查找过程: 当访问某个对象的属性或者方法时,先到这个对象本身中去查找,
如果查找到,就是使用,整个查找过程结束。否则,就到这个对象的原型对象中去查找,
如果查找到,查找结束,否则再到原型对象的原型对象中去寻找,一般是Object的原型对象,

如果还没找到,继续往上查找,但 Object的原型对象认为是原型链的终点,
因此整个查找过程结束,返回查找失败。对于属性,返回 属性 is undefined, 对于方法,返回  fn is not a function

☆☆★★查找某个变量,是通过原型链来查找的☆☆★★
☆☆★★查找对象的属性或是方法,是通过原型链来查找的☆☆★★

我们来看两个小测试:

<script>
  //原型链的测试1: 给所有的数组对象添加一个查找某个值得位置
     Array.prototype.getIndex=function(num){
       for(var i=0,length=this.length;i<length;i++){
           if(this[i]==num){
              return i;
          }
      }
       return -1;
    }
   
   var a1=[1,2,3,4,5];
   var num=a1.getIndex(6); //num=-1

    //给所有的数字对象添加一个求和的方法getSum
   Number.prototype.getSum=function(){
   var sum=0;
   //alert("getSum函数中");
   for(var i=0;i<arguments.length;i++){
        sum+=arguments[i];
     }
    return sum;
   };
  var n1=new Number(10);
  var sum2=n1.getSum(1,2,3,4,5);
  alert(sum2); //15

</script>

================== 华丽的分割线=============

//原型链的测试2:
 <script type="text/javascript"> 
     function Person(){
  
     }
    Object.prototype.email="zdl@163.com";
    var p1=new Person();
    p1.name="zhangsan";
    p1.age=20;
 
   //判断p1 自身(而不是原型对象中)是否拥有某个属性?
   if( p1.hasOwnProperty("email") ){
        alert("有email");
    }else{
      alert("无emial");
    } //结果为 "无email属性"

 /* 2016-6-1 09:59:27
   那么问题来了,p1对象并没有hasOwnProperty方法,它是哪里来的?
   原型链的查找过程: 当访问某个对象的属性或者方法时,先到这个对象本身中去查找,
   如果查找到,就是使用,整个查找过程结束。否则,就到这个对象的原型对象中去查找,
   (这里是Person.prototype),如果查找到,查找结束,否则再到原型对象的原型对象中去寻找,
   一般是Object的原型对象,如果还没找到,继续往上查找,但 Object的原型对象认为是原型链的终点,
   整个查找过程结束,返回查找失败。对于属性,返回 p1.name is undefined,对于方法
   ,返回 p1.fn is not a function
 
    ☆☆★★查找某个变量,是通过原型链来查找的☆☆★★
    ☆☆★★查找对象的属性或是方法,是通过原型链来查找的☆☆★★
  */
  
   这里访问到的是通过原型链查找到的 Object.prototype的email ,而不是对象p1自身的属性
   alert(p1.email); //"zdl@163.com"

   alert(p1.hasOwnProperty("name")); //true
   alert(p1.hasOwnProperty("age")); //true
</script>
 

 

转载请注明:凌风阁 » 详解Javascript中的原型链

喜欢 (8)
发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址