问答:
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
是一个构造函数,函数也是对象,那么Person
就拥有属性prototype
和__proto__
。prototype
指向Person
的原型对象,即Person.prototype
,而__proto__
指向构造Person
的函数的原型,即Function.prototype
。 -
Person.prototype
是Person
的原型对象,拥有属性constructor
和__proto__
。constructor
指向Person
,__proto__
指向Object.prototype
。 -
p
作为Person
构造出来的实例对象,拥有属性__proto__
,指向Person.prototype
。
2.上列中,对对象p可以调用p.toString
。toString
是哪里来的?画出原型图?并解释什么是原型链。
toString
来自于Object.toString
。原型图如下:
当访问
p.toString
时,先在对象p
的基本属性中查找,发现没有,然后通过__proto__
去Person.prototype
中查找,还是没有,再通过__proto__
去Object.prototype
中查找,最终找到了toString
,完成访问。当访问一个对象的属性或方法时,先在基本属性中查找,如果没有,再沿着
__proto__
这条链向上找,这就是原型链。
3.对String
做扩展,实现如下方式获取字符串中频率最高的字符
String.prototype.getMostOften = function(){
var str = this;
var obj = {}; //创建一个obj对象用来储存每个字符元素和它出现的次数
for (var i = 0;i<str.length;i++){
if(!obj[str[i]]){ //判断当前字符是否在obj对象中出现过
obj[str[i]] = 1; //如果没有出现过,次数为1
}else{
obj[str[i]] ++; //如果出现过,次数加1
}
}
console.log(obj);
var max = 0; //初始化一个最大次数
var mostWord= []; //创建一个mostWord数组储存出现最多的字符
for(var key in obj){
if(obj[key] > max){
max = obj[key];
mostWord = []; //找到出现次数最多的字符后,清空数组,将该字符储存到数组中。
mostWord.push(key);
}
else if( obj[key] === max){
mostWord.push(key) //若有多个字符出现的次数相同,也储存到数组中。
}
}
var result = mostWord.join("和");
console.log("出现次数最多的字符为:"+result+",出现"+max+"次");
}
4.instanceof
有什么作用?内部逻辑是如何实现的?
- 作用:
instanceof
运算符用来检测某个构造函数的原型是否存在于要检测的对象的原型链上。在判断引用类型的时候,可以用到该运算符。 - 内部逻辑:
instanceof
运算符的第一个变量是一个对象:obj,第二个对象一般是一个构造函数:Func。判断逻辑是:沿着obj.__proto__
这条线来找,如果找到一个对象是Func.prototype
,就返回true,如果找到终点都没有找到,就返回false。用函数表示就是:
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;
}
instanceOf
运算符其实表达就是一个对象的原型链结构。结合问答2的原型图可以看一些有趣的例子:
function Person(name){
this.name = name;
}
Person.prototype.sayName = function(){
console.log('My name is :' + this.name);
}
var p = new Person("若愚")
p.sayName();
console.log(p instanceof Person) //true;
console.log(p instanceof Object) //true;
console.log(Person instanceof Function) //true;
console.log(p instanceof Function) //false;
console.log(Function instanceof Function)//true;
console.log(Function instanceof Object) //true;
console.log(Object instanceof Function) //true;
本文版权归本人和饥人谷所有,转载请注明来源。