問答
1.有如下代碼,解釋Person、 prototype、proto、p、constructor之間的關(guān)聯(lián)。


2.上例中,對(duì)對(duì)象 p可以這樣調(diào)用 p.toString()。toString是哪里來的? 畫出原型圖?并解釋什么是原型鏈。

- 原型鏈:對(duì)象的屬性和方法,有可能是定義在自身,也有可能是定義在它的原型對(duì)象。由于原型本身也是對(duì)象,又有自己的原型,所以形成了一條原型鏈(prototype chain)。比如,a對(duì)象是b對(duì)象的原型,b對(duì)象是c對(duì)象的原型,以此類推。
如果一層層地上溯,所有對(duì)象的原型最終都可以上溯到Object.prototype,即Object構(gòu)造函數(shù)的prototype屬性指向的那個(gè)對(duì)象。那么,Object.prototype對(duì)象有沒有它的原型呢?回答可以是有的,就是沒有任何屬性和方法的null對(duì)象,而null對(duì)象沒有自己的原型。 - “原型鏈”的作用是,讀取對(duì)象的某個(gè)屬性時(shí),JavaScript引擎先尋找對(duì)象本身的屬性,如果找不到,就到它的原型去找,如果還是找不到,就到原型的原型去找。如果直到最頂層的Object.prototype還是找不到,則返回undefined。
- 如果對(duì)象自身和它的原型,都定義了一個(gè)同名屬性,那么優(yōu)先讀取對(duì)象自身的屬性,這叫做“覆蓋”(overiding)。
- 需要注意的是,一級(jí)級(jí)向上,在原型鏈尋找某個(gè)屬性,對(duì)性能是有影響的。所尋找的屬性在越上層的原型對(duì)象,對(duì)性能的影響越大。如果尋找某個(gè)不存在的屬性,將會(huì)遍歷整個(gè)原型鏈。
3.對(duì)String做擴(kuò)展,實(shí)現(xiàn)如下方式獲取字符串中頻率最高的字符

String.prototype.getMostOften = function(){
var json = {},
max = 0,
result;
for(var i=0;i<this.length;i++){
if(json[this[i]]!==undefined){
json[this[i]] += 1//這個(gè)字母出現(xiàn)一次就在后面加一次1, 給json設(shè)key&value,value就是出現(xiàn)次數(shù)
}else{
json[this[i]]=1;
}
}
for(var key in json){
if(json[key]>max){//經(jīng)常使用這種方式比較大小。。假設(shè)一個(gè)值誰(shuí)比他大就等于誰(shuí)最后再返回出來,該值就是最大值
max = json[key];
result = key;
}
}
return result;
}
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因?yàn)閐 出現(xiàn)了5次
4.instanceOf有什么作用??jī)?nèi)部邏輯是如何實(shí)現(xiàn)的?
- instanceof運(yùn)算符返回一個(gè)布爾值,表示指定對(duì)象是否為某個(gè)構(gòu)造函數(shù)的實(shí)例。instanceof運(yùn)算符的左邊是實(shí)例對(duì)象,右邊是構(gòu)造函數(shù)。它的運(yùn)算實(shí)質(zhì)是檢查右邊構(gòu)建函數(shù)的原型對(duì)象,是否在左邊對(duì)象的原型鏈上。
//用于判斷Func的原型對(duì)象是否在obj的原型鏈上
function isInstanceOf(obj,Func){
var O = obj.__proto__;
var F = Func.prototype;
while(true){
if(O===F){
return true
}
O = O.__proto__;
if(O===null){
return false
}//當(dāng)最終指向null,也就是Object的原型對(duì)象
}
}

微信截圖_20161102165949.png