原型链

作者: 浩天天 | 来源:发表于2016-11-21 16:25 被阅读47次
    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是一个构造函数它拥有prototype属性,prototype是Person的原型对象,p是Person构造出来的对象,proto是p中对Person的prototype的实现,它指向了Person构造函数的原型对象prototype,p中的sayName的方法是定义在prototype,意味着使用Person所构造出来的对象都拥有sayName的方法。constructor也是p里的属性,它指向它的构造函数Person。

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

    由图可知,p.proto === People.prototype,在对象p中没有的方法将会在proto中也就是,Person.prototype中寻找。Person.prototype.proto === Object.prototype,如果在Person的内部对象Person.prototype中没有的方法将会在Person.prototype.proto中寻找,最终toString方法在Object.prototype中找到被对象p调用。
    原型链:JavaScript的原型链是个内部对象的链,每个被创建的对象都有proto都指向创建这个对象的构造函数的内部对象xxxx.prototype。而object.prototype.proto为终点并指向null。
    3.对String做扩展,实现如下方式获取字符串中频率最高的字符
    //todo....
    
    var str = 'ahbbccdeddddfg';
    var ch = str.getMostOften();
    console.log(ch); //d , 因为d 出现了5次
    
        String.prototype.getMostOften = function(){
            var obj = {},
                    maxNum = 0,
                    maxKey;
            for(var i = 0;i < this.length;i++){
                if(obj[this[i]]){
                    obj[this[i]] += 1
                }else{
                    obj[this[i]] = 1
                }
            }
            for(var key in obj){
                if(obj[key]>maxNum){
                    maxNum = obj[key]
                    maxKey = key
                }
            }
            return maxKey
        }
    
    var str = 'ahbbccdeddddfg';
    var ch = str.getMostOften();
    console.log(ch); //d , 因为d 出现了5次
    
    4.instanceOf有什么作用?内部逻辑是如何实现的?

    instanceOf是用来查看一个对象是否是一个构造函数的实例。

    function instanceOf(obj,Func){
        do{
            if(obj.__proto__ ===Func.prototype){
                return true
            }
            if(!obj.__proto__){
                return false
            }
        }while(obj.__proto__=obj.__proto__.__proto__)
        return false
    }
    

    判断引用类型的proto和目标对象的prototype是否相等,如果不相等则继续获取对象的下层proto直到全部对比完成。
    本教程版权归本人和饥人谷所有,转载请注明出处

    相关文章

      网友评论

        本文标题:原型链

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