原型链
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直到全部对比完成。
本教程版权归本人和饥人谷所有,转载请注明出处