国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript原型繼承_動力節點Java學院整理

2019-11-19 16:12:58
字體:
來源:轉載
供稿:網友

在傳統的基于Class的語言如Java、C++中,繼承的本質是擴展一個已有的Class,并生成新的Subclass。
由于這類語言嚴格區分類和實例,繼承實際上是類型的擴展。但是,JavaScript由于采用原型繼承,我們無法直接擴展一個Class,因為根本不存在Class這種類型。

但是辦法還是有的。我們先回顧Student構造函數:

function Student(props) {  this.name = props.name || 'Unnamed';}Student.prototype.hello = function () {  alert('Hello, ' + this.name + '!');}

以及Student的原型鏈:

現在,我們要基于Student擴展出PrimaryStudent,可以先定義出PrimaryStudent

function PrimaryStudent(props) {  // 調用Student構造函數,綁定this變量:  Student.call(this, props);  this.grade = props.grade || 1;}

但是,調用了Student構造函數不等于繼承了StudentPrimaryStudent創建的對象的原型是:

new PrimaryStudent() ----> PrimaryStudent.prototype ----> Object.prototype ----> null

必須想辦法把原型鏈修改為:

new PrimaryStudent() ----> PrimaryStudent.prototype ----> Student.prototype ----> Object.prototype ----> null

這樣,原型鏈對了,繼承關系就對了。新的基于PrimaryStudent創建的對象不但能調用PrimaryStudent.prototype定義的方法,也可以調用Student.prototype定義的方法。
如果你想用最簡單粗暴的方法這么干:
PrimaryStudent.prototype = Student.prototype;

是不行的!如果這樣的話,PrimaryStudentStudent共享一個原型對象,那還要定義PrimaryStudent干啥?

我們必須借助一個中間對象來實現正確的原型鏈,這個中間對象的原型要指向Student.prototype。為了實現這一點,參考道爺(就是發明JSON的那個道格拉斯)的代碼,中間對象可以用一個空函數F來實現:

// PrimaryStudent構造函數:function PrimaryStudent(props) {  Student.call(this, props);  this.grade = props.grade || 1;}// 空函數F:function F() {}// 把F的原型指向Student.prototype:F.prototype = Student.prototype;// 把PrimaryStudent的原型指向一個新的F對象,F對象的原型正好指向Student.prototype:PrimaryStudent.prototype = new F();// 把PrimaryStudent原型的構造函數修復為PrimaryStudent:PrimaryStudent.prototype.constructor = PrimaryStudent;// 繼續在PrimaryStudent原型(就是new F()對象)上定義方法:PrimaryStudent.prototype.getGrade = function () {  return this.grade;};// 創建xiaoming:var xiaoming = new PrimaryStudent({  name: '小明',  grade: 2});xiaoming.name; // '小明'xiaoming.grade; // 2// 驗證原型:xiaoming.__proto__ === PrimaryStudent.prototype; // truexiaoming.__proto__.__proto__ === Student.prototype; // true// 驗證繼承關系:xiaoming instanceof PrimaryStudent; // truexiaoming instanceof Student; // true

用一張圖來表示新的原型鏈:

注意,函數F僅用于橋接,我們僅創建了一個new F()實例,而且,沒有改變原有的Student定義的原型鏈。
如果把繼承這個動作用一個inherits()函數封裝起來,還可以隱藏F的定義,并簡化代碼:

function inherits(Child, Parent) {  var F = function () {};  F.prototype = Parent.prototype;  Child.prototype = new F();  Child.prototype.constructor = Child;}這個inherits()函數可以復用:function Student(props) {  this.name = props.name || 'Unnamed';}Student.prototype.hello = function () {  alert('Hello, ' + this.name + '!');}function PrimaryStudent(props) {  Student.call(this, props);  this.grade = props.grade || 1;}// 實現原型繼承鏈:inherits(PrimaryStudent, Student);// 綁定其他方法到PrimaryStudent原型:PrimaryStudent.prototype.getGrade = function () {  return this.grade;};

小結

JavaScript的原型繼承實現方式就是:

1.定義新的構造函數,并在內部用call()調用希望“繼承”的構造函數,并綁定this;
2.借助中間函數F實現原型鏈繼承,最好通過封裝的inherits函數完成;
3.繼續在新的構造函數的原型上定義新方法。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 菏泽市| 古田县| 云浮市| 珠海市| 平利县| 浙江省| 平原县| 盐池县| 高青县| 台州市| 成武县| 徐汇区| 万安县| 临武县| 界首市| 龙岩市| 佛山市| 盈江县| 长岛县| 泸西县| 赤峰市| 麻江县| 昆山市| 固始县| 文安县| 寿宁县| 驻马店市| 奉贤区| 大安市| 永城市| 绥江县| 湛江市| 南召县| 淮南市| 深泽县| 弋阳县| 孟津县| 乐平市| 岱山县| 吉安县| 宁国市|