亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

JS學習筆記之原型鏈和利用原型實現繼承詳解

2024-05-06 16:51:32
字體:
來源:轉載
供稿:網友

本文實例講述了JS學習筆記之原型鏈和利用原型實現繼承。分享給大家供大家參考,具體如下:

原型鏈

原型鏈是一種關系,實例對象和原型對象之間的關系,關系是通過原型(__proto__)來聯系的

實例對象中有__proto__,是對象,叫原型,不是標準的屬性,瀏覽器使用,并且有的游覽器不支持
構造函數中有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("玩啥呢")   }

原型的簡單語法  

利用原型共享數據

第一種 寫法

 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("好好學習i")    }  var stu=new Student("小紅",20,"男")  console.dir(stu)

結果

JS,原型鏈,繼承

第二種 寫法

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

 

結果

JS,原型鏈,繼承

我們會發現 兩種寫法還是有差別的  ,第二種寫法會導致constructor構造器屬性消失 所以我們得手動修改構造器指向

最終代碼

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("好好學習i")    }   }  var stu=new Student("小紅",20,"男")  console.dir(stu)

 

好了,這回有了

JS,原型鏈,繼承

實例對象使用屬性或方法的規則

實例對象使用的屬性或方法,現在實例中查找,如果有則使用自身的屬性或方法,
如果沒有,則通過__proto__指向的原型對象 查找方法,找到則使用,
如果找不到則繼續向__proto__尋找,直到未找到時報錯

構造函數和實例對象和原型對象之間的關系

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

改變原型是否可以改變?

首先我們得知道構造函數和實例對象中的this 指向的是什么

這里我創建了自定義構造函數 Person ,并在內部輸出了this 

并且在Person 的原型對象上添加了一個eat 方法,也輸出了一個this,

接著我實例化了一個對象,并調用eat方法,

我們執行一下,查看結果如何

JS,原型鏈,繼承

輸出結果

JS,原型鏈,繼承

由此得出

原型對象中方法中的this 就是實例對象

構造函數中的this就是實例對象

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

JS,原型鏈,繼承

這段代碼中,首先我定義了一個Person自定義構造函數,并且在原型上添加了一個eat方法

定義了一個Student 函數,在原型上定義了一個sayHi方法,

然后我將 Student的原型指向 了一個 Person的實例對象

接著實例化一個Student,接著分別在stu 實例上 嘗試著調用 eat方法 和 sayHi 方法,

運行結果

JS,原型鏈,繼承

到此我們可以確定,stu實例對象原型指向被下面這條代碼改變了

Student.prototype=new Person(10);

總結

原型指向可以被改變的

實例對象的原型__proto__指向的是該對象所在的構造函數的原型對象

構造函數的原型對象(prototype)指向如果改變了,實例對象的原型(__proto__)指向也會發生改變

實例對象和原型對象之間的關系是通過__proto__ 原型來聯系起來的,這個關系就是原型鏈

如果原型指向改變了,那么就應該再原型改變指向之后添加原型方法

那么sayHi方法則會創建在 new Person(10) 這個實例對象上

原型最終指向了哪里

實例對象中的__proto__指向的是構造函數的prototype

以此代碼為例

JS,原型鏈,繼承

測試一下

JS,原型鏈,繼承

JS,原型鏈,繼承

所以

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

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

JS,原型鏈,繼承

這里祭出祖傳JPG

JS,原型鏈,繼承

實現繼承

小知識---->instanceof的判斷方法:

從左邊操作數的__proto__路線出發,從右邊操作數的prototype出發,如果兩條路線最終指向一個引用就是true了

1.利用 call 借用構造函數繼承

優點:實現了繼承屬性,但值都不相同

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

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){  //將當前實例對象傳入Person 借過來使用一次來達到繼承效果  Person.call(this,name,age,sex,weight);  this.score=score;}var stu1=new Student("小明",10,"男","10kg","100")

2.  prototype 實現繼承

利用prototype,將Student 的prototype 指向 Person 來達到繼承效果,

優點:繼承了父級原型上的方法

缺點:   實例化多個Student 都必須共用相同的name 和 age 

Student.prototype.constructor=Student

注意:   使用原型繼承時,需要將構造器的指向更改回正確的指向

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 吃飯

3.組合繼承

組合繼承其實就是結合了上述的兩種方法來實現繼承,擁有兩種方法的優點

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){    //借用構造函數    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()//吃東西

4.拷貝繼承

類似于復制,把一個對象中的屬性和方法直接復制到另一個對象中

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

JS,原型鏈,繼承

每次都要for in 好累 ,  可以進行優化封裝一下

function extend(Child,Parent) {    var p = Parent.prototype;    var c = Child.prototype;    for (var i in p) {      c[i] = p[i];      }        //這個屬性直接指向父對象的prototype屬性,可以直接調用父對象的方法,為了實現繼承的完備性,純屬備用性質    c.par = p;  }

5. 直接繼承prototype

優點 : 效率比較高

缺點 : 因為相當于是個傳址過程 所以修改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

JS,原型鏈,繼承

6.利用空對象作中介實現繼承

用這種方式修改 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

JS,原型鏈,繼承

封裝一下

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

 

希望本文所述對大家JavaScript程序設計有所幫助。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
一区二区三区视频免费在线观看| 欧美俄罗斯乱妇| 国产精品96久久久久久| 亚洲乱码av中文一区二区| 97涩涩爰在线观看亚洲| 激情懂色av一区av二区av| 亚洲精品欧美日韩专区| 国产aⅴ夜夜欢一区二区三区| 国产亚洲欧美aaaa| 精品美女永久免费视频| 亚洲精品国产成人| 国产午夜精品美女视频明星a级| 国产福利精品视频| 久久久久久久国产| 日韩免费电影在线观看| 亚洲网站在线看| 日韩精品中文字幕在线播放| 蜜月aⅴ免费一区二区三区| 亚洲黄色在线观看| 久久久久久一区二区三区| 久久综合电影一区| 国产精品一区久久| 成人免费视频在线观看超级碰| 欧美—级高清免费播放| 国产精品视频区1| 中国人与牲禽动交精品| 欧美一级大片在线免费观看| 国产丝袜一区二区三区免费视频| 热99久久精品| 国产精品高潮呻吟视频| 欧美日韩激情视频8区| 国产精品a久久久久久| 最好看的2019的中文字幕视频| 日韩精品免费在线视频| 免费av一区二区| 色yeye香蕉凹凸一区二区av| 少妇精69xxtheporn| 亚洲国产精品久久| 亚洲成人激情小说| 日韩av在线网页| 亚洲在线免费视频| 欧美在线一级视频| 成人免费在线视频网站| 丝袜亚洲另类欧美重口| 中文字幕最新精品| 国产精品av网站| 97免费中文视频在线观看| 91av在线免费观看视频| 伊人久久大香线蕉av一区二区| 成人福利网站在线观看| 国产亚洲美女精品久久久| 亚洲国产精久久久久久久| 九色精品美女在线| 美女久久久久久久久久久| 久久久久免费精品国产| 亚洲的天堂在线中文字幕| 亚洲第一精品电影| 久久精品国产69国产精品亚洲| 91精品视频在线免费观看| 中文字幕日韩有码| 亚洲欧洲日本专区| 国语自产精品视频在线看一大j8| 日韩美女免费线视频| 国产成人一区二区在线| 成人激情在线播放| 午夜精品久久久久久久男人的天堂| 狠狠干狠狠久久| 国产欧美va欧美va香蕉在线| 国产精品自在线| 日韩国产一区三区| 在线视频欧美性高潮| 成人久久久久久| 亚洲第一精品夜夜躁人人爽| 亚洲欧洲午夜一线一品| 欧美午夜www高清视频| 欧美精品videofree1080p| 97人人爽人人喊人人模波多| 久久久久99精品久久久久| 2023亚洲男人天堂| 国产精品久久久久久久久免费| 亚洲成人av在线播放| 国产精品稀缺呦系列在线| 欧美日韩免费区域视频在线观看| 最好看的2019的中文字幕视频| 精品国内产的精品视频在线观看| 精品一区二区电影| 亚洲午夜精品久久久久久久久久久久| 91久久在线视频| 亚洲欧美综合v| 91久久在线观看| 狠狠久久亚洲欧美专区| 欧美体内谢she精2性欧美| wwwwwwww亚洲| 欧美精品videossex88| 日韩视频免费观看| 日韩免费黄色av| 精品一区二区三区四区在线| 亚洲精品国产成人| 久久夜色精品国产| 永久免费精品影视网站| 亚洲欧美综合另类中字| 国产精品丝袜白浆摸在线| 一区二区亚洲精品国产| 午夜免费在线观看精品视频| 国产精品久久久久久久午夜| 九九热视频这里只有精品| 不用播放器成人网| 久久久成人av| 国产mv久久久| 亚洲国产精品成人va在线观看| 97精品一区二区视频在线观看| 亚洲激情视频网| 国产热re99久久6国产精品| 久久久人成影片一区二区三区观看| 日韩欧美a级成人黄色| 国产一区二区丝袜高跟鞋图片| 成人午夜一级二级三级| 动漫精品一区二区| 一区二区三区视频观看| 精品一区二区电影| 欧美日韩亚洲成人| 欧美成人精品在线| 91av在线看| 亚洲free性xxxx护士hd| 97国产精品久久| 欧美日韩国产精品专区| 亚洲人成在线播放| 久久精品人人做人人爽| 亚洲精品国产综合久久| 亚洲xxx自由成熟| 久久久国产影院| 亚洲综合中文字幕68页| 日韩中文在线不卡| 亚洲女成人图区| 国产欧美va欧美va香蕉在线| 国产精品6699| 亚洲精品www久久久| 国产精品久久久久久av福利软件| 丝袜美腿精品国产二区| 久久精品中文字幕电影| 91高清视频免费观看| 国产精品91久久久| 国产91色在线播放| 伊人青青综合网站| 高清一区二区三区日本久| 国产精品福利在线| 欧美另类极品videosbest最新版本| 亚洲国产欧美自拍| 91午夜在线播放| 久久亚洲一区二区三区四区五区高| 亚洲老头老太hd| 日韩中文理论片| 久久久精品久久| 精品成人69xx.xyz| 国内精品久久久久影院 日本资源| 91免费精品国偷自产在线| 国产欧美一区二区白浆黑人| 国产日韩中文在线| 亚洲欧美日韩在线高清直播| 77777少妇光屁股久久一区| 粗暴蹂躏中文一区二区三区| 狠狠做深爱婷婷久久综合一区| 精品国产999| 亚洲精品aⅴ中文字幕乱码|