Js 對象之間的繼承及原型鏈查找分析

  • Js 對象之間的繼承

    • 構(gòu)造函數(shù)的屬性繼承

    • ①對象拷貝 :使用for....in循環(huán)繼承父對象屬性

      <script>
              var student1 = {
                  name : "lisi",
                  id : 1213,
                  meaasge : function(){
                      console.log(name + "," + id);
                  }
              };
      
              //使用for....in循環(huán)繼承父對象屬性
              //封裝成一個函數(shù)
              function student(parent,child){
                   for (var k in parent) {
                      if (child[k]) {
                          continue;//對于student2里獨有的要保留的值,則跳過該次循環(huán)
                      }
                      child[k] = parent[k];
                  }
              }
              student(student1,student2);
              console.log(student2);
          </script>
          
      

      上述繼承父對象是對象拷貝判哥,實際上繼承指的是類型和類型之間的繼承遥倦,而封裝的構(gòu)造函數(shù)就是用來創(chuàng)建類對象的

    • ②原型繼承

      //原型繼承
              function Person(name, age, sex, score) {
                      this.name = name;
                      this.age = age;
                      this.sex = sex;
              } //抽象谤绳,提取所有的公共屬性,放到一個父類型中
      
              function Student(score){
                  this.score = score;
              }
              function Teacher(course){
                  this.crouse = crouse;
              }
             
              //原型對象袒哥,可以將自己的屬性和方法繼承給將來的實例對象使用
              Student.prototype = new Person("li",21,"male");
      
              //生成一個實例
              var s1 = new Student(90);
              console.dir(s1);
      

      ????原型繼承缩筛,在沒有修改constructor之前,Student是沒有自己的constructor屬性的堡称,但它有繼承Person對象是的constructor屬性瞎抛,它指向的是Person。所以却紧,這里需要人為定義一個constructor屬性桐臊,指向Student胎撤。

        //原型對象,可以將自己的屬性和方法繼承給將來的實例對象使用
              Student.prototype = new Person("li",21,"male");
      
              Studnet.prototype.constructor = Student;
              //生成一個實例
              var s1 = new Student(90);
              console.dir(s1);
              console.log(s1.constructor);
      

    這種繼承的缺點是豪硅,只能繼承一次哩照,不適用屬性的繼承。

    • ③函數(shù)的 call 方法

       //函數(shù)的 call 方法
              function fn(a,b){
                  console.log(this);//指向的是window
                  console.log(a+b);
      
              }
              var name = {
                  name:"li"
              };
              //普通函數(shù)的調(diào)用fn(1懒浮,1)
              //call方法 第一個參數(shù)用來指定this飘弧,第二個及以后傳的是實參。
              fn.call(name,3,3);
      

      ? ? ? ?函數(shù)call 砚著,函數(shù)本身就是一種對象捎琐,可以有自己的屬性和方法簇爆。call方法本身就是一種指向函數(shù)的方法。

      ? ? ? ? call方法 在調(diào)用函數(shù)的時候,有兩個功能:①更改函數(shù)內(nèi)部的this指向愉耙;②調(diào)用函數(shù)執(zhí)行內(nèi)部代碼,其當(dāng)調(diào)用時炕舵,第一個參數(shù)用來指定this拄查,第二個及以后傳的是實參。

  • ④借用構(gòu)造函數(shù)繼承屬性

    ? ? ? ?直接對父類型的構(gòu)造函數(shù)進行一個普通調(diào)用餐胀,在調(diào)用的過程中哟楷,內(nèi)部的this指向的是window,通過call方法更改Person內(nèi)部的this指向調(diào)用函數(shù)(如否灾,student調(diào)用的卖擅,使用call方法后,this指向的是student)

    //借用構(gòu)造函數(shù)繼承屬性
            function Person(name, age, sex) {
                this.name = name;
                this.age = age;
                this.sex = sex;
            } //抽象墨技,提取所以的公共屬性惩阶,放到一個父類型中
    
            function Student(name,age,sex,score){
                //對父類型進行一個普通調(diào)用
                Person.call(this,name,age,sex);
                this.score = score;
            }
            function Teacher(name,age,sex,course){
                Person.call(this,name,age,sex)
                this.crouse = crouse;
            }
    
            var s2 = new Student("li",22,"male",90);
            console.dir(s2);
    
  • 構(gòu)造函數(shù)的方法的繼承

    for...in繼承、原型繼承扣汪、

    ①for...in繼承

            //構(gòu)造函數(shù)的方法繼承
            function Person(name, age, sex) {
                this.name = name;
                this.age = age;
                this.sex = sex;
            } //抽象断楷,提取所有的公共屬性,放到一個父類型中
            Person.prototype.message = function(){
                console.log(123);
            }
    
            function Student(name,age,sex,score){
                Person.call(this,name,age,sex);
                this.score = score;
            }
            function Teacher(name,age,sex,course){
                Person.call(this,name,age,sex)
                this.crouse = crouse;
            }
    
            //for ..in繼承
            for(var k in Person.prototype){
                //Student保留自己的constructor 不讓Studnet繼承Person的constructor
                if(k == "constructor"){
                    continue;
                }
                Student.prototype[k] = Person.prototype[k];
            }
    

    ②原型繼承

    //原型繼承
            Student.prototype = new Person();
            //在繼承的情況下也不能改變Student的constructor的指向
            Student.prototype.constructor = Student;
    
            var s1 = new Student("li",21,"male",91);
            s1.message();
            console.dir(s1);
    

    ③組合繼承:屬性在構(gòu)造函數(shù)內(nèi)部繼承私痹,方法通過原型繼承

    //構(gòu)造函數(shù)的方法繼承
            function Person(name, age, sex) {
                this.name = name;
                this.age = age;
                this.sex = sex;
            } //抽象脐嫂,提取所有的公共屬性,放到一個父類型中
            Person.prototype.message = function(){
                console.log(123);
            }
    
            function Student(name,age,sex,score){
            //屬性的繼承紊遵,使用call方法繼承
                Person.call(this,name,age,sex);
                this.score = score;
            }
            function Teacher(name,age,sex,course){
                Person.call(this,name,age,sex)
                this.crouse = crouse;
            }
            
            //方法繼承账千,通過原型繼承
            Student.prototype = new Person();
            //在繼承的情況下也不能改變Student的constructor的指向
            Student.prototype.constructor = Student;
    
            var s1 = new Student("li",21,"male",91);
            s1.message();
            console.dir(s1);
    
    [外鏈圖片轉(zhuǎn)存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-b5YjTJO9-1615779490405)(C:\Users\xiaomi\AppData\Roaming\Typora\typora-user-images\image-20210315112105641.png)]
通過實例對象本身查找自己原型鏈的方法,這個方法繼承的是Person的方法暗膜,再查找new Person()的實例對象的原型對象匀奏,查找出它的方法。





Student函數(shù)部分的原型圖

在這里插入圖片描述

完整的原型鏈查找:

????將Person對象的實例賦值給Student.prototype学搜,所以s1指向的原型對象是Person對象娃善。

????而Person的message()方法則存放在Person的原型對象中论衍,所以s1在調(diào)用方法時,首先在自身的方法中查找聚磺,沒有查找到坯台;繼續(xù)向原型查找,自己的原型上還沒有找到方法瘫寝;那么原型方法又要在自己的原型上繼續(xù)查找蜒蕾,找到message()方法。

????如果還未找到焕阿,即Person的原型對象上還是沒有該方法咪啡,則繼續(xù)想Person原型對象的原型對象查找,查找Object原型對象暮屡,若還沒有撤摸,則查找錯誤。


在這里插入圖片描述
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末褒纲,一起剝皮案震驚了整個濱河市准夷,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌莺掠,老刑警劉巖冕象,帶你破解...
    沈念sama閱讀 211,948評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異汁蝶,居然都是意外死亡,警方通過查閱死者的電腦和手機论悴,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,371評論 3 385
  • 文/潘曉璐 我一進店門掖棉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人膀估,你說我怎么就攤上這事幔亥。” “怎么了察纯?”我有些...
    開封第一講書人閱讀 157,490評論 0 348
  • 文/不壞的土叔 我叫張陵帕棉,是天一觀的道長。 經(jīng)常有香客問我饼记,道長香伴,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,521評論 1 284
  • 正文 為了忘掉前任具则,我火速辦了婚禮即纲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘博肋。我一直安慰自己低斋,他們只是感情好蜂厅,可當(dāng)我...
    茶點故事閱讀 65,627評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著膊畴,像睡著了一般掘猿。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上唇跨,一...
    開封第一講書人閱讀 49,842評論 1 290
  • 那天稠通,我揣著相機與錄音,去河邊找鬼轻绞。 笑死采记,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的政勃。 我是一名探鬼主播唧龄,決...
    沈念sama閱讀 38,997評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奸远!你這毒婦竟也來了既棺?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,741評論 0 268
  • 序言:老撾萬榮一對情侶失蹤懒叛,失蹤者是張志新(化名)和其女友劉穎丸冕,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體薛窥,經(jīng)...
    沈念sama閱讀 44,203評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡胖烛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,534評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了诅迷。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片佩番。...
    茶點故事閱讀 38,673評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖罢杉,靈堂內(nèi)的尸體忽然破棺而出趟畏,到底是詐尸還是另有隱情,我是刑警寧澤滩租,帶...
    沈念sama閱讀 34,339評論 4 330
  • 正文 年R本政府宣布赋秀,位于F島的核電站,受9級特大地震影響律想,放射性物質(zhì)發(fā)生泄漏猎莲。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,955評論 3 313
  • 文/蒙蒙 一技即、第九天 我趴在偏房一處隱蔽的房頂上張望益眉。 院中可真熱鬧,春花似錦、人聲如沸郭脂。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,770評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽展鸡。三九已至屿衅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間莹弊,已是汗流浹背涤久。 一陣腳步聲響...
    開封第一講書人閱讀 32,000評論 1 266
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留忍弛,地道東北人响迂。 一個月前我還...
    沈念sama閱讀 46,394評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像细疚,于是被迫代替她去往敵國和親蔗彤。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,562評論 2 349

推薦閱讀更多精彩內(nèi)容