原型链

作者: Jeff12138 | 来源:发表于2017-10-05 18:18 被阅读0次

    7、有如下代码,解释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所创建的一个实例对象。
    prototype是构造函数Person的原型属性;而__ proto__是实例对象p的一个属性,它指向构造函数Person的原型属性prototype。即有:

    p.__proto__ === Person.prototype;
    

    又由于Person.prototype本身也是一个对象,它包含一个属性constructor,指向Person本身。因此又有:

    p.__proto__.constructor === Person.prototype.constructor === Person;
    

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

    toString()来自Object的原型属性prototype中。
    当对实例对象p调用toString()函数时,首先会默认在p自身的属性和方法中找;没有找到,则会通过p的__ proto__属性,到其构造函数Person的原型属性prototype中找;还是找不到,则通过Person.prototype的__ proto__属性,到Object的原型属性prototype中找,找到后就会调用执行。
    原型图如下:



    JS中的对象都有一个内置属性proto,指向其构造函数的原型属性prototype。在访问一个对象属性的时候,如果该对象本身没有这个属性,就会沿着上述的路径一层层找到对应的属性。这样的层层递进的关系就是原型链。

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

    var str = 'ahbbccdeddddfg';
    var ch = str.getMostOften();
    console.log(ch); //d , 因为d 出现了5次
    
    String.prototype.getMostOften = function(){
      var obj = {}
      var n = 0
      var s
      for(var i = 0; i < this.length; i++){
        if(obj[this[i]]){
          obj[this[i]]++
        }else{
          obj[this[i]] = 1
        }
      }
      for(var key in obj){
        if(n < obj[key]){
          n = obj[key]
          s = key
        }
      }
      return s
    }
    var str = 'ahbbccdeddddfg'
    var ch = str.getMostOften()
    console.log(ch)
    

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

    instanceof操作符,用于判断一个对象是不是某个类型的实例,返回一个布尔值。
    具体实现的逻辑是:先判断p.__ proto__是否指向Person.prototype。如果不是,接着判断p.__ proto__.__ proto__是否指向Person.prototype…以此类推,直到结果为null,则返回false;如果在查找过程中发现p是Person.prototype的实例,则返回true。

    相关文章

      网友评论

          本文标题:原型链

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