原型鏈

問答

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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容