1. 有如下代碼清钥,解釋Person、 prototype后众、proto胀糜、p、constructor之間的關(guān)聯(lián)蒂誉。
<pre>function Person(name){ this.name = name; } Person.prototype.sayName = function(){ console.log('My name is :' + this.name); } var p = new Person("若愚") p.sayName();
</pre>
Person是一個(gè)構(gòu)造函數(shù)教藻,p是由構(gòu)造函數(shù)創(chuàng)建的對(duì)象,并且傳遞了一個(gè)參數(shù)“若愚”右锨,即對(duì)象name的屬性值就是“若愚”括堤。由于Person是一個(gè)構(gòu)造函數(shù),函數(shù)也是對(duì)象绍移,那么Person就擁有prototype屬性悄窃,并且prototype屬性也是一個(gè)對(duì)象,稱為原型對(duì)象蹂窖,這個(gè)對(duì)象中可以放置一些共用的屬性和方法轧抗,其中有一個(gè)constructor屬性,這個(gè)屬性是一個(gè)函數(shù)瞬测,指向Person函數(shù)本身鸦致,p作為有Person創(chuàng)建的對(duì)象,擁有__proto__
屬性涣楷,這個(gè)屬性指向其原型對(duì)象即Person.prototype,當(dāng)調(diào)用p對(duì)象的sayName方法的時(shí)候抗碰,首先從p對(duì)象自身去找狮斗,如果找到就調(diào)用方法,如果沒(méi)有找到就去p的原型對(duì)象Person.prototype上找弧蝇,在原型對(duì)象中找到了sayName方法碳褒,此時(shí)this指向調(diào)用它的對(duì)象p,打印出結(jié)果My name is :若愚看疗。如果還 沒(méi)有找到的話沙峻,則繼續(xù)向上找,知道Object對(duì)象的原型為止两芳。
2. 上例中摔寨,對(duì)對(duì)象 p可以這樣調(diào)用 p.toString()。toString是哪里來(lái)的? 畫出原型圖?并解釋什么是原型鏈怖辆。
首先實(shí)例p會(huì)尋找自己的toString方法是复,如果 沒(méi)有找到删顶,則會(huì)繼續(xù)去構(gòu)造函數(shù)Person的prototype找toString方法,如果還是沒(méi)有找到淑廊,就繼續(xù)往構(gòu)造函數(shù)的Person.__proto__
的prototype逗余,即Object.prototype找toString方法,最終找到toString方法季惩。
原型鏈:使用構(gòu)造函數(shù)構(gòu)造出來(lái)的對(duì)象會(huì)有一個(gè)__proto__
屬性录粱,它指向構(gòu)造函數(shù)的原型對(duì)象prototype,原型對(duì)象prototype作為一個(gè)對(duì)象也擁有__proto__
屬性画拾,它指向原型對(duì)象的構(gòu)造者啥繁,也就是Object對(duì)象的prototype屬相。由__proto__
指向構(gòu)造者的prototype原型對(duì)象碾阁,在最終指向Object對(duì)象構(gòu)成的鏈條输虱,就是原型鏈。
3. 對(duì)String做擴(kuò)展脂凶,實(shí)現(xiàn)如下方式獲取字符串中頻率最高的字符宪睹?
<pre>`
//todo....
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因?yàn)閐 出現(xiàn)了5次
`</pre>
<pre>`
String.prototype.getMostOften = function(){
var str = this;
var arr = {};
var max = 0;//初始化最大次數(shù)
//for 循環(huán)string內(nèi)的每一個(gè)字母 如果出現(xiàn)過(guò)這個(gè)字母就在后面的次數(shù)上+1,沒(méi)出現(xiàn)過(guò)就 =1
for(var i = 0;i<str.length;i++){
if(arr[str[i]]){
arr[str[i]]++ //當(dāng)前字符出現(xiàn)蚕钦,出現(xiàn)次數(shù)加1
}else{
arr[str[i]] = 1; //當(dāng)前字符沒(méi)有出現(xiàn)的話亭病,次數(shù)為1
}
}
console.log(arr);
for(var key in arr){
if(max<arr[key]){ //遍歷屬性,找出最大的值賦值給max
max = arr[key]
}
}
for(var key in arr){
if(arr[key] ==max){ //返回出現(xiàn)最多字符的結(jié)果
return'最多字符是:'+key+','+'出現(xiàn)次數(shù)是:'+max;
}
}
}
`</pre>
4. instanceOf有什么作用嘶居??jī)?nèi)部邏輯是如何實(shí)現(xiàn)的罪帖?
作用:instanceof 的作用是判斷一個(gè)對(duì)象是不是一個(gè)函數(shù)的實(shí)例。比如 obj instanceof fn邮屁, 實(shí)際上是判斷fn的prototype是不是在obj的原型鏈上整袁。比如: obj.proto === fn.prototype, obj.proto.proto === fn.prototype佑吝,obj.proto...proto_ === fn.prototype坐昙,只要一個(gè)成立即可。
內(nèi)部邏輯:通過(guò)判斷某個(gè)對(duì)象的內(nèi)部指針__proto__
是否與所測(cè)試對(duì)象的prototype屬性相等來(lái)實(shí)現(xiàn)芋忿。
<pre>function isObjInstanceOfFunc(obj,func){ var __proto__ = obj.__proto__; do{ if(obj.__proto__ ===Func.prototype) return true; if(!__proto__) return false; }while(__proto__ = __proto__.__proto__) return false; }
</pre>
版權(quán)歸本人及饑人谷所有炸客,轉(zhuǎn)載請(qǐng)注明出處。