问题7:有如下代码,解释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();
/*p.__proto__ === Person.prototype
p.__proto__.constructor === Person
Person.prototype.constructor === Person
*/
问题8: 上例中,对对象 p可以这样调用 p.toString()。toString是哪里来的? 画出原型图?并解释什么是原型链。
原型链:
-
p.toString()
方法,先从p
的属性里面找,没有, - 再从
p.__proto__
中找,还是没有 - 再从
p.__proto__.__proto__
中找,找到了,
这样沿着
__proto__
这个链子一路找下去,就是原型链
问题9:对String做扩展,实现如下方式获取字符串中频率最高的字符
var str = 'ahbbccdeddddfg';
String.prototype.getMostOften = function(){
var obj = {}
var maxIndex = 0
//把字符串中的每个字符作为 obj 中的key,出现的次数作为value
for(var i=0; i<this.length; i++){
if(obj[this[i]]){
obj[this[i]]++
}else{
obj[this[i]] = 1
}
}
//找到最大的value,也就是最多出现了几次
for(var key in obj){
if(obj[key] > maxIndex){
maxIndex = obj[key]
}
}
//找到对应的key,也就是出现最多次数的字符
for(var key in obj){
if(obj[key]===maxIndex){
return [key, obj[key]]
}
}
}
var ch = str.getMostOften();
console.log(ch);
//["d", 5]
问题10: instanceof 有什么作用?内部逻辑是如何实现的?
作用:判断是不是一个对象的实例,返回值是 true、false
var arr = []
obj = {}
arr instanceof Array //true
//内部逻辑为看实例的 __proto__ 是否为构造函数的 prototype 原型
arr.__proto__ === Array.prototype //true
//如果为 true ,则返回结果 true
arr instanceof Object //true
//内部逻辑为看实例的 __proto__ 是否为构造函数的 prototype 原型
arr.__proto__ === Object.prototype //false
//如果为 false ,则继续看下一层的 __proto__
arr.__proto__.__proto__ === Object.prototype //true
//如果为 true ,则返回结果 true
obj instanceof Array //false
//内部逻辑为看实例的 __proto__ 是否为构造函数的 prototype 原型
obj.__proto__ === Array.prototype //false
//如果为 false ,则继续看下一层的 __proto__
obj.__proto__.__proto__ === Array.prototype //false
//如果到最深一层的 __proto__ (最深一层为null)比较还是不相等,则返回 false