原型链

作者: coolheadedY | 来源:发表于2016-09-28 03:07 被阅读21次
    • 有如下代码,解释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();
    
    • 当new一个构造函数的时候会创建一个对象,p为通过new Person创建的对象,构造函数Person.prototype等于被创建的对象p的__proto__

    • 构造函数Person下的Person.prototype内的constructor指向此构造函数Person本身。

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


    • 图中可知,p.__proto__ === People.prototype, 在对象p中没有的方法将会在p.__proto__也就是People.prototype下寻找;People.prototype.__proto__ === Object.prototype,如果在People的内部对象People.prototype中没有的方法将会在People.prototype.__proto__也就是Object.prototype中寻找,最终toString方法在Object.prototype中找到,被对象p调用。

    • 原型链:Javascript的原型链是内部对象链:每个被创建的函数都有一个__proto__, 都指向创建这个函数的'父函数'的内部对象xxx.prototypeObject.prototype.__proto__为最终点,指向null。

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

    //todo....
    var str = 'ahbbccdeddddfg';
    var ch = str.getMostOften();
    console.log(ch); //d , 因为d 出现了5次
    
            //todo....
            String.prototype.getMostOften = function(){
                var str = this,
                    dict = {},
                    num = 0,
                    keyMax;
                for(var i = 0; i < str.length; i ++){
                    if (dict[str[i]] === undefined) {
                        dict[str[i]] = 1;
                    } else {
                        dict[str[i]] ++;
                    }
                }
                for(var key in dict){
                    if(dict[key] > num){
                        num = dict[key];
                        keyMax = key;
                    }
                }
                return keyMax + ':' + num;
            }
            var str = 'ahbbccdeddddfg';
            var ch = str.getMostOften();
            console.log(ch); //d , 因为d 出现了5次
    
    • instanceOf有什么作用?内部逻辑是如何实现的?
    • instanceof运算符返回一个布尔值,表示指定对象是否为某个构造函数的实例。
    var x = [a,b,c];
    var y = {};
    x instanceof Array // true
    y instanceof Object // true
    
    • 它的运算实质是检查右边构建函数的原型对象,是否在左边对象的原型链上。
    p instanceof People// 等同于
    People.prototype.isPrototypeOf(p)
    
    • 内部原理:
     function isObjInstanceOffunc(obj,func) {
      var __proto__=obj.__proto__;
      do{
        if(__proto__===func.prototype) return true;
      }while(__proto__=__proto__.proto__)
      return false;
    }
    

    本博客版权归 本人和饥人谷所有,转载需说明来源

    相关文章

      网友评论

          本文标题:原型链

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