javascript知识深化

原型链

2016-11-21  本文已影响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直到全部对比完成。
本教程版权归本人和饥人谷所有,转载请注明出处

上一篇下一篇

猜你喜欢

热点阅读