原型育苟、原型鏈和原型繼承

原型鏈

原型鏈?zhǔn)且环N關(guān)系抖僵,實例對象和原型對象之間的關(guān)系,關(guān)系是通過原型(proto)來聯(lián)系的镰绎;
實例對象中有proto,是對象,叫原型,不是標(biāo)準(zhǔn)的屬性,瀏覽器使用,并且有的游覽器不支持
構(gòu)造函數(shù)中有prototype屬性,也是對象,叫原型脓斩;

注意: 原型中的方法是可以互相訪問的

實例代碼

function Animal(name,age){
       this.name=name;
       thia.age=age;
    }
    //在原型中添加方法
    Animal.prototype.eat=function(){
       console.log("動物吃草")
       this.play()
    }
    Animal.prototype.play=function(){
       console.log("玩啥呢")
    }

原型的簡單語法

利用原型共享數(shù)據(jù)

  • 第一種 寫法
 function Student(name,age,sex){
            this.name=name;
            this.age=age;
            this.sex=sex;
     }
     Student.prototype.height="188"
     Student.prototype.weight="55kg"
     Student.prototype.study=function(){
            console.log("好好學(xué)習(xí)i")
        }
    var stu=new Student("小紅",20,"男")
    console.dir(stu)

結(jié)果:


image.png
  • 第二種 寫法
 function Student(name,age,sex){
            this.name=name;
            this.age=age;
            this.sex=sex;
     }
    Student.prototype={
        height:"188",
        weight:"55kg",
        study:function(){
            console.log("好好學(xué)習(xí)i")
        }
     }
    var stu=new Student("小紅",20,"男")
    console.dir(stu)

結(jié)果:


image.png

我們會發(fā)現(xiàn) 兩種寫法還是有差別的 ,第二種寫法會導(dǎo)致constructor構(gòu)造器屬性消失 所以我們得手動修改構(gòu)造器指向

最終代碼

function Student(name,age,sex){
            this.name=name;
            this.age=age;
            this.sex=sex;
     }
    Student.prototype={
        constructor:Student,
        height:"188",
        weight:"55kg",
        study:function(){
            console.log("好好學(xué)習(xí)i")
        }
     }
    var stu=new Student("小紅",20,"男")
    console.dir(stu)

好了,這回有了


image.png

實例對象使用屬性或方法的規(guī)則

  • 實例對象使用的屬性或方法,現(xiàn)在實例中查找,如果有則使用自身的屬性或方法畴栖,
  • 如果沒有随静,則通過proto指向的原型對象 查找方法,找到則使用,
  • 如果找不到則繼續(xù)向proto尋找吗讶,直到未找到時報錯

構(gòu)造函數(shù)和實例對象和原型對象之間的關(guān)系

  • 構(gòu)造函數(shù)可以實例化對象
  • 構(gòu)造函數(shù)中有一個屬性叫prototype,是構(gòu)造函數(shù)的原型對象
  • 構(gòu)造函數(shù)的原型對象(prototype)中有一個constructor 構(gòu)造器燎猛,這個構(gòu)造器指向的就是自己所在的原型對象所在的構(gòu)造函數(shù)
  • 實例對象的原型對象(proto) 指向的是該構(gòu)造函數(shù)的原型對象(prototype)
  • 構(gòu)造函數(shù)的原型對象(prototype)中的方法是可以被實例對象直接訪問

改變原型是否可以改變?

首先我們得知道構(gòu)造函數(shù)和實例對象中的this 指向的是什么?
這里我創(chuàng)建了自定義構(gòu)造函數(shù) Person ,并在內(nèi)部輸出了this ,并且在Person 的原型對象上添加了一個eat 方法,也輸出了一個this照皆,接著我實例化了一個對象重绷,并調(diào)用eat方法,
我們執(zhí)行一下膜毁,查看結(jié)果如何:


image.png

輸出結(jié)果


image.png

由此得出

  • 原型對象中方法中的this 就是實例對象
  • 構(gòu)造函數(shù)中的this就是實例對象.

接下來我們嘗試改變一下原型的指向

image.png

這段代碼中昭卓,首先我定義了一個Person自定義構(gòu)造函數(shù),并且在原型上添加了一個eat方法,
定義了一個Student 函數(shù)瘟滨,在原型上定義了一個sayHi方法候醒,
然后我將 Student的原型指向 了一個 Person的實例對象,
接著實例化一個Student,接著分別在stu 實例上 嘗試著調(diào)用 eat方法 和 sayHi 方法杂瘸,
運行結(jié)果:

到此我們可以確定倒淫,stu實例對象的原型指向被下面這條代碼改變了
Student.prototype=new Person(10);

總結(jié):

  • 原型指向可以被改變的;
  • 實例對象的原型proto指向的是該對象所在的構(gòu)造函數(shù)的原型對象;
  • 構(gòu)造函數(shù)的原型對象(prototype)指向如果改變了,實例對象的原型(proto)指向也會發(fā)生改變;
  • 實例對象和原型對象之間的關(guān)系是通過proto 原型來聯(lián)系起來的败玉,這個關(guān)系就是原型鏈;
  • 如果原型指向改變了敌土,那么就應(yīng)該再原型改變指向之后添加原型方法, 那么sayHi方法則會創(chuàng)建在 new Person(10) 這個實例對象上

原型最終指向了哪里?

實例對象中的proto指向的是構(gòu)造函數(shù)的prototype

以此代碼為例:

image.png

測試一下


image.png
image.png

所以

per實例對象的proto ---指向---> Person.prototype的proto ---指向---> Object.prototype的proto 是Null

查看了一下html的dom對象,這有很有意思的原型鏈


image.png

這里祭出祖?zhèn)鱆PG

image.png

實現(xiàn)繼承

小知識---->instanceof的判斷方法:
從左邊操作數(shù)的proto路線出發(fā)绒怨,從右邊操作數(shù)的prototype出發(fā)纯赎,如果兩條路線最終指向一個引用就是true了

  • 利用 call 借用構(gòu)造函數(shù)繼承

優(yōu)點:實現(xiàn)了繼承屬性,但值都不相同

缺點: 無法繼承父級類別中原型上的方法

function Person(name,age,sex,weight){
    this.name=name;
    this.age=age;
    this.sex=sex;
    this.weight=weight;
}
Person.prototype.sayHi=function(){
    console.log("您好")
}
 
function Student(name,age,sex,weight,score){
    //將當(dāng)前實例對象傳入Person 借過來使用一次來達(dá)到繼承效果
    Person.call(this,name,age,sex,weight);
    this.score=score;
}
 
var stu1=new Student("小明",10,"男","10kg","100")
  • prototype 實現(xiàn)繼承: 利用prototype南蹂,將Student 的prototype 指向 Person 來達(dá)到繼承效果;

優(yōu)點:繼承了父級原型上的方法

缺點: 實例化多個Student 都必須共用相同的name 和 age
Student.prototype.constructor=Student
注意: 使用原型繼承時犬金,需要將構(gòu)造器的指向更改回正確的指向

function Person(name,age){
        this.name=name;
        this.age=age;
     }
 
     Person.prototype.eat=function(){
        console.log("Person 吃飯")
     }
 
     function Student(num,score){
        this.num=num
        this.score=score
     }
     //繼承
    Student.prototype=new Person("小紅",10)
    Student.prototype.constructor=Student
 
    var stu =new Student(2016002288,80)
 
    stu.eat()//Person 吃飯
  • 組合繼承: 組合繼承其實就是結(jié)合了上述的兩種方法來實現(xiàn)繼承,擁有兩種方法的優(yōu)點
function Person(name,age,sex){
        this.name=name;
        this.age=age;
        this.sex=sex;
     }
     Person.prototype.sayHi=function(){
        console.log("你好")
     }
 
     function  Student(name,age,sex,score){
        //借用構(gòu)造函數(shù)
        Person.call(this,name,age,sex)
        this.score=score
     }
 
     // 改變了原型指向
     Student.prototype=new Person();//不傳值
     Student.prototype.eat=function(){
        console.log("吃東西");
     }
 
     var stu=new Student("小黑",20,"男","100分")
     console.log(stu.name,stu.age,stu.sex,stu.score);
     stu.sayHi()//你好
     stu.eat()//吃東西
  • 拷貝繼承: 類似于復(fù)制六剥,把一個對象中的屬性和方法直接復(fù)制到另一個對象中
function Person(){
    }
 
    Person.prototype.name="小紅"
    Person.prototype.age=18
 
    function Student(){
    }
    
    var p=Person.prototype;
    var s=Student.prototype;
 
    for(key in p){
        s[key]=p[key]
    }
 
    console.dir(Student)

console結(jié)果:

image.png

每次都要for in 好累 , 可以進(jìn)行優(yōu)化封裝一下

function extend(Child,Parent) {
 
    var p = Parent.prototype;
    var c = Child.prototype;
 
    for (var i in p) {
      c[i] = p[i];
      }
        
        //這個屬性直接指向父對象的prototype屬性,可以直接調(diào)用父對象的方法,為了實現(xiàn)繼承的完備性晚顷,純屬備用性質(zhì)
    c.par = p;
 
  }
  • 直接繼承prototype
    優(yōu)點 : 效率比較高
    缺點 : 因為相當(dāng)于是個傳址過程 所以修改Student的屬性 Person 的也會被更改
    function Person(){};
 
    Person.prototype.name="小紅";
    Person.prototype.age=18;
 
    function Student(){};
 
    Student.prototype=Person.prototype;
 
    console.dir(Student);
    console.dir(Person);
    Student.prototype.age=25;

console結(jié)果:

image.png
  • 利用空對象作中介實現(xiàn)繼承: 用這種方式修改 Student 的prototype 不會影響到 Person的prototype
function Person(){};
    Person.prototype.name="小紅";
    Person.prototype.age=11;
 
    function Student(){};
    var F=function(){};
    F.prototype=Person.prototype;
 
    Student.prototype=new F();
    Student.prototype.constructor=Student;
 
    Student.prototype.age=25;
 
    console.dir(Person)
    console.dir(Student)

console結(jié)果:

image.png

封裝一下

function extend(Child,Parent) {
 
    var F = function(){};
 
    F.prototype = Parent.prototype;
 
    Child.prototype = new F();
 
    Child.prototype.constructor = Child;
 
    Child.par = Parent.prototype;
 
  }

————————————————
原文鏈接:https://blog.csdn.net/m0_37846579/article/details/80278092

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市疗疟,隨后出現(xiàn)的幾起案子该默,更是在濱河造成了極大的恐慌,老刑警劉巖策彤,帶你破解...
    沈念sama閱讀 212,454評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件栓袖,死亡現(xiàn)場離奇詭異匣摘,居然都是意外死亡,警方通過查閱死者的電腦和手機裹刮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評論 3 385
  • 文/潘曉璐 我一進(jìn)店門音榜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人捧弃,你說我怎么就攤上這事赠叼。” “怎么了违霞?”我有些...
    開封第一講書人閱讀 157,921評論 0 348
  • 文/不壞的土叔 我叫張陵嘴办,是天一觀的道長。 經(jīng)常有香客問我买鸽,道長涧郊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評論 1 284
  • 正文 為了忘掉前任癞谒,我火速辦了婚禮底燎,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘弹砚。我一直安慰自己双仍,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,770評論 6 386
  • 文/花漫 我一把揭開白布桌吃。 她就那樣靜靜地躺著朱沃,像睡著了一般。 火紅的嫁衣襯著肌膚如雪茅诱。 梳的紋絲不亂的頭發(fā)上逗物,一...
    開封第一講書人閱讀 49,950評論 1 291
  • 那天,我揣著相機與錄音瑟俭,去河邊找鬼翎卓。 笑死,一個胖子當(dāng)著我的面吹牛摆寄,可吹牛的內(nèi)容都是我干的失暴。 我是一名探鬼主播,決...
    沈念sama閱讀 39,090評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼微饥,長吁一口氣:“原來是場噩夢啊……” “哼逗扒!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起欠橘,我...
    開封第一講書人閱讀 37,817評論 0 268
  • 序言:老撾萬榮一對情侶失蹤矩肩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后肃续,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體黍檩,經(jīng)...
    沈念sama閱讀 44,275評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡叉袍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,592評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了刽酱。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片畦韭。...
    茶點故事閱讀 38,724評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖肛跌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情察郁,我是刑警寧澤衍慎,帶...
    沈念sama閱讀 34,409評論 4 333
  • 正文 年R本政府宣布,位于F島的核電站皮钠,受9級特大地震影響稳捆,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜麦轰,卻給世界環(huán)境...
    茶點故事閱讀 40,052評論 3 316
  • 文/蒙蒙 一乔夯、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧款侵,春花似錦末荐、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至妹笆,卻和暖如春块请,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拳缠。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評論 1 266
  • 我被黑心中介騙來泰國打工墩新, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窟坐。 一個月前我還...
    沈念sama閱讀 46,503評論 2 361
  • 正文 我出身青樓海渊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親狸涌。 傳聞我的和親對象是個殘疾皇子切省,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,627評論 2 350

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