原型链

1.有如下代码,解释Personprototype__proto__pconstructor之间的关联。

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

先清楚以下三点:

  • 1.每个函数都有一个prototype属性,这个属性是一个指针,指向一个对象,也就是该函数的原型对象;
  • 2.原型对象和实例中都有一个constructor属性,均指向了构造函数本身;
    Person.prototype.constructor==Person //true
    p.constructor==Person //true
  • 3.实例中有一个__proto__属性,该属性指向了原型对象;
    p.__proto__==Person.prototype //true

所以,在这个例子中,prototypePerson的一个属性,该属性指向了Person的原型对象,也即Person.prototypePerson的原型对象,constructor是该原型对象的一个属性,指向Person; pPerson的一个实例,该实例拥有__proto__属性,该属性指向Person.prototype

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


当访问p.toString时,先在对象p的基本属性中查找,发现没有,然后通过__proto__Person.prototype中查找,还是没有,再通过__proto__Object.prototype中查找,最终找到了toString()方法。
当访问一个对象的属性或方法时,先在基本属性中查找,如果没有,再沿着__proto__这条链向上找,这就是原型链

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

 String.prototype.getMoreOften=function(){
     var str=this,
         count=0,
         letter="";
      while(str.length>0){
         for(var i=0; i<str.length; i++){
            re=new RegExp(str.split("")[0],"g");
            if(count<str.match(re).length){
                count=str.match(re,"").length;
                letter=str.split("")[0];
            }
            str=str.replace(re,"");
          }
       }
   return letter;
}

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

instanceof 的作用是判断一个对象是不是一个函数的实例。实现方式是通过判断某个实例对象的内部指针__proto__是否与所测试对象(函数)的prototype属性相等来实现

function instanceof(obj,Func){
            var __proto__ = obj.__proto__;
            do{
                if(__proto__ === Func.prototype) return true;
                if(!__proto__) return false;
            }while(__proto__ = __proto__.__proto__)
             return false;
        }
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容