原型链

问答

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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容