问答
1.有如下代码,解释Person、 prototype、proto、p、constructor之间的关联。
2.上例中,对对象 p可以这样调用 p.toString()。toString是哪里来的? 画出原型图?并解释什么是原型链。
- 原型链:对象的属性和方法,有可能是定义在自身,也有可能是定义在它的原型对象。由于原型本身也是对象,又有自己的原型,所以形成了一条原型链(prototype chain)。比如,a对象是b对象的原型,b对象是c对象的原型,以此类推。
如果一层层地上溯,所有对象的原型最终都可以上溯到Object.prototype,即Object构造函数的prototype属性指向的那个对象。那么,Object.prototype对象有没有它的原型呢?回答可以是有的,就是没有任何属性和方法的null对象,而null对象没有自己的原型。
- “原型链”的作用是,读取对象的某个属性时,JavaScript引擎先寻找对象本身的属性,如果找不到,就到它的原型去找,如果还是找不到,就到原型的原型去找。如果直到最顶层的Object.prototype还是找不到,则返回undefined。
- 如果对象自身和它的原型,都定义了一个同名属性,那么优先读取对象自身的属性,这叫做“覆盖”(overiding)。
- 需要注意的是,一级级向上,在原型链寻找某个属性,对性能是有影响的。所寻找的属性在越上层的原型对象,对性能的影响越大。如果寻找某个不存在的属性,将会遍历整个原型链。
3.对String做扩展,实现如下方式获取字符串中频率最高的字符
String.prototype.getMostOften = function(){
var json = {},
max = 0,
result;
for(var i=0;i<this.length;i++){
if(json[this[i]]!==undefined){
json[this[i]] += 1//这个字母出现一次就在后面加一次1, 给json设key&value,value就是出现次数
}else{
json[this[i]]=1;
}
}
for(var key in json){
if(json[key]>max){//经常使用这种方式比较大小。。假设一个值谁比他大就等于谁最后再返回出来,该值就是最大值
max = json[key];
result = key;
}
}
return result;
}
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因为d 出现了5次
4.instanceOf有什么作用?内部逻辑是如何实现的?
- instanceof运算符返回一个布尔值,表示指定对象是否为某个构造函数的实例。instanceof运算符的左边是实例对象,右边是构造函数。它的运算实质是检查右边构建函数的原型对象,是否在左边对象的原型链上。
//用于判断Func的原型对象是否在obj的原型链上
function isInstanceOf(obj,Func){
var O = obj.__proto__;
var F = Func.prototype;
while(true){
if(O===F){
return true
}
O = O.__proto__;
if(O===null){
return false
}//当最终指向null,也就是Object的原型对象
}
}