问题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
是构造函数内部的原型对象 指向 Person.prototype
__proto__
是p new
出来的一个对象,对象的__proto__
指向 Person.prototype
constructor
指向Person
问题2: 对象 p可以这样调用 p.toString()。toString是哪里来的? 画出原型图?并解释什么是原型链。
function Person(name){
this.name = name;
}
Person.prototype.sayName = function(){
console.log('My name is :' + this.name);
}
var p = new Person("若愚")
p.sayName();
p.toString();
toString() 从原型链上得来
首先 p.toString方法,会在自己属性上查找,如果没有找到会沿着__proto__
属性继续到构造函数Person.prototype
里找toString
方法,如果还未找到,再继续往Person.prototype
的__proto__
最后找到toString()
方法。
原型链:
每个构造函数和对象都有一个隐藏的__proto__
属性,当我们访问一个对象的属性时,如果这个对象内部不存在这个属性,那么他就会去prototype
里找这个属性,这个prototype
里没找到的话,又会在自己的__proto__
找,于是就这样一直找下去,这样就组成了一条链,这个就是原型链。
问题3:对String做扩展,实现如下方式获取字符串中频率最高的字符
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因为d 出现了5次
var str = 'ahbbccdeddddfg';
String.prototype.getMostOften = function(){
var obj = {};
for (var i = 0; i < str.length; i++) {
var index = str[i];
if(obj[index]){
obj[index]++;
}else{
obj[index] = 1;
}
}
var maxNumber = 0,maxString;
for(var key in obj){
if(obj[key] > maxNumber){
maxNumber = obj[key];
maxString = key;
}
}
console.log("字符 " + maxString+ " 出现频率 " + maxNumber+ " 次");
}
var ch = str.getMostOften();
console.log(ch); //d , 因为d 出现了5次
问题4: instanceOf有什么作用?内部逻辑是如何实现的?
instanceOf
判断一个对象是不是某个类型的实例
function Car(make, model, year) {
this.make = make;
this.model = model;
this.year = year;
}
var mycar = new Car("Honda", "Accord", 1998);
mycar instanceof Car; // 返回 true
mycar instanceof Object; // 返回 true
mycar instanceof String; // 返回 false