1.有如下代碼,解釋Person、 prototype、proto、p、constructor之間的關(guān)聯(lián)。
function Person(name){
this.name = name;
}
Person.prototype.sayName = function(){
console.log('My name is :' + this.name);
}
var p = new Person("若愚")
p.sayName();
Person是一個構(gòu)造函數(shù)它擁有prototype屬性,prototype是Person的原型對象,p是Person構(gòu)造出來的對象,proto是p中對Person的prototype的實現(xiàn),它指向了Person構(gòu)造函數(shù)的原型對象prototype,p中的sayName的方法是定義在prototype,意味著使用Person所構(gòu)造出來的對象都擁有sayName的方法。constructor也是p里的屬性,它指向它的構(gòu)造函數(shù)Person。
2.上例中,對對象 p可以這樣調(diào)用 p.toString()。toString是哪里來的? 畫出原型圖?并解釋什么是原型鏈。

由圖可知,p.proto === People.prototype,在對象p中沒有的方法將會在proto中也就是,Person.prototype中尋找。Person.prototype.proto === Object.prototype,如果在Person的內(nèi)部對象Person.prototype中沒有的方法將會在Person.prototype.proto中尋找,最終toString方法在Object.prototype中找到被對象p調(diào)用。
原型鏈:JavaScript的原型鏈是個內(nèi)部對象的鏈,每個被創(chuàng)建的對象都有proto都指向創(chuàng)建這個對象的構(gòu)造函數(shù)的內(nèi)部對象xxxx.prototype。而object.prototype.proto為終點并指向null。
3.對String做擴展,實現(xiàn)如下方式獲取字符串中頻率最高的字符
//todo....
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因為d 出現(xiàn)了5次
String.prototype.getMostOften = function(){
var obj = {},
maxNum = 0,
maxKey;
for(var i = 0;i < this.length;i++){
if(obj[this[i]]){
obj[this[i]] += 1
}else{
obj[this[i]] = 1
}
}
for(var key in obj){
if(obj[key]>maxNum){
maxNum = obj[key]
maxKey = key
}
}
return maxKey
}
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因為d 出現(xiàn)了5次
4.instanceOf有什么作用?內(nèi)部邏輯是如何實現(xiàn)的?
instanceOf是用來查看一個對象是否是一個構(gòu)造函數(shù)的實例。
function instanceOf(obj,Func){
do{
if(obj.__proto__ ===Func.prototype){
return true
}
if(!obj.__proto__){
return false
}
}while(obj.__proto__=obj.__proto__.__proto__)
return false
}
判斷引用類型的proto和目標對象的prototype是否相等,如果不相等則繼續(xù)獲取對象的下層proto直到全部對比完成。
本教程版權(quán)歸本人和饑人谷所有,轉(zhuǎn)載請注明出處