第三十六弹-原型链

一、问答

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

      function Person(name){
        this.name = name;
      }
      Person.prototype.sayName = function(){
        console.log('My name is :' + this.name);
      }
      var p = new Person("若愚")
      p.sayName();

Person:构造函数
p:Person构造函数创造的实例对象
Person.prototype: p对应的原型对象
constructor:原型对象的一个属性,等于Person.prototype
p.__proto__:等于Person.prototype


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

每个对象上都有一个proto 属性,这个属性会指向该对象的原型对象,而原型对象也会有这个proto属性指向自己的原型对象,这种关系直到指向Object对象结束,这个链条式的关系就是原型链。
在调用对象的属性和方法时,首先在自己本身上找,然后再上原型链上寻找,直到找到合适的为止,如果找到Object对象还未找到就会返回未定义。

Paste_Image.png


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

      String.prototype.getMostOften=function(){
        var arr=this.split(""),
            storeLen={},
            mostlen,
            mostChar;
        for (var i=0;i<arr.length;i++){
          var tmpChar=arr[i];
          if(storeLen[tmpChar]){
            storeLen[tmpChar]+=1;
          }else{
            storeLen[tmpChar]=1;
          }
        }
       for (var key in storeLen){
         // 初始化mostChar和mostlen等于第一个属性||比较最大值
          if(!mostChar||storeLen[key]>mostlen){
            mostChar=key;
            mostlen=storeLen[key];
          }
       }
       return mostChar;
      }
      var str = 'ahbbccdeddddfg';
      var ch = str.getMostOften();
      console.log(ch); //d , 因为d 出现了5次

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

instanceof 用来检查对象是否是构造函数的实例。
内部逻辑是判断从原型链底端向上判断原型链上的对象是否是否是该构造函数的原型对象

      function instanceOf(obj,Fn){
          if(typeof obj!=="object"||typeof Fn!=="function") return false;
          var __proto__=obj.__proto__;
          while (__proto__) {
            if( __proto__===Fn.prototype){
              return true;
            }
             __proto__= __proto__.__proto__;
          }
        return false;
      }

参考文档:


本教程版权归小韩同学和饥人谷所有,转载须说明来源

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容