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("cxx");
p.sayName();
先清楚以下三点:
- 1.每个函数都有一个
prototype
属性,这个属性是一个指针,指向一个对象,也就是该函数的原型对象; - 2.原型对象和实例中都有一个constructor属性,均指向了构造函数本身;
Person.prototype.constructor==Person //true
p.constructor==Person //true
- 3.实例中有一个
__proto__
属性,该属性指向了原型对象;
p.__proto__==Person.prototype //true
所以,在这个例子中,prototype
是Person
的一个属性,该属性指向了Person
的原型对象,也即Person.prototype
是Person
的原型对象,constructor
是该原型对象的一个属性,指向Person
; p
是Person
的一个实例,该实例拥有__proto__
属性,该属性指向Person.prototype
。
2.上例中,对对象 p可以这样调用 p.toString()。toString是哪里来的? 画出原型图?并解释什么是原型链。
当访问
p.toString
时,先在对象p的基本属性中查找,发现没有,然后通过__proto__
去Person.prototype
中查找,还是没有,再通过__proto__
去Object.prototype中
查找,最终找到了toString()方法。当访问一个对象的属性或方法时,先在基本属性中查找,如果没有,再沿着
__proto__
这条链向上找,这就是原型链。
3.对String做扩展,实现如下方式获取字符串中频率最高的字符
String.prototype.getMoreOften=function(){
var str=this,
count=0,
letter="";
while(str.length>0){
for(var i=0; i<str.length; i++){
re=new RegExp(str.split("")[0],"g");
if(count<str.match(re).length){
count=str.match(re,"").length;
letter=str.split("")[0];
}
str=str.replace(re,"");
}
}
return letter;
}
4.instanceof有什么作用?内部逻辑是如何实现的?
instanceof 的作用是判断一个对象是不是一个函数的实例。实现方式是通过判断某个实例对象的内部指针__proto__
是否与所测试对象(函数)的prototype属性相等来实现
function instanceof(obj,Func){
var __proto__ = obj.__proto__;
do{
if(__proto__ === Func.prototype) return true;
if(!__proto__) return false;
}while(__proto__ = __proto__.__proto__)
return false;
}