原型链

作者: 饥人谷_罗伟恩 | 来源:发表于2016-11-02 17:00 被阅读0次

    问答

    1.有如下代码,解释Person、 prototype、proto、p、constructor之间的关联。

    2.上例中,对对象 p可以这样调用 p.toString()。toString是哪里来的? 画出原型图?并解释什么是原型链。

    • 原型链:对象的属性和方法,有可能是定义在自身,也有可能是定义在它的原型对象。由于原型本身也是对象,又有自己的原型,所以形成了一条原型链(prototype chain)。比如,a对象是b对象的原型,b对象是c对象的原型,以此类推。
      如果一层层地上溯,所有对象的原型最终都可以上溯到Object.prototype,即Object构造函数的prototype属性指向的那个对象。那么,Object.prototype对象有没有它的原型呢?回答可以是有的,就是没有任何属性和方法的null对象,而null对象没有自己的原型。
    • “原型链”的作用是,读取对象的某个属性时,JavaScript引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined。
    • 如果对象自身和它的原型,都定义了一个同名属性,那么优先读取对象自身的属性,这叫做“覆盖”(overiding)。
    • 需要注意的是,一级级向上,在原型链寻找某个属性,对性能是有影响的。所寻找的属性在越上层的原型对象,对性能的影响越大。如果寻找某个不存在的属性,将会遍历整个原型链。

    3.对String做扩展,实现如下方式获取字符串中频率最高的字符

      String.prototype.getMostOften = function(){
        var json = {},
            max = 0,
            result;
        for(var i=0;i<this.length;i++){
          if(json[this[i]]!==undefined){
            json[this[i]] += 1//这个字母出现一次就在后面加一次1, 给json设key&value,value就是出现次数
          }else{
            json[this[i]]=1;
          }
        }
        
        for(var key in json){
          if(json[key]>max){//经常使用这种方式比较大小。。假设一个值谁比他大就等于谁最后再返回出来,该值就是最大值
            max = json[key];
            result = key;
          }
        }
        return result;
      }  
    
      var str = 'ahbbccdeddddfg';
      var ch = str.getMostOften();
      console.log(ch); //d , 因为d 出现了5次
    

    4.instanceOf有什么作用?内部逻辑是如何实现的?

    • instanceof运算符返回一个布尔值,表示指定对象是否为某个构造函数的实例。instanceof运算符的左边是实例对象,右边是构造函数。它的运算实质是检查右边构建函数的原型对象,是否在左边对象的原型链上。
    //用于判断Func的原型对象是否在obj的原型链上
    function isInstanceOf(obj,Func){
      var O = obj.__proto__;
      var F = Func.prototype;
      while(true){
          if(O===F){
           return true
           }  
          O = O.__proto__;
          if(O===null){
            return false
           }//当最终指向null,也就是Object的原型对象  
      }
    }
    
    微信截图_20161102165949.png

    相关文章

      网友评论

          本文标题:原型链

          本文链接:https://www.haomeiwen.com/subject/zievuttx.html