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

首頁 > 編程 > JavaScript > 正文

JavaScript是如何實現繼承的(六種方式)

2019-11-20 10:18:59
字體:
來源:轉載
供稿:網友

前言:大多OO語言都支持兩種繼承方式: 接口繼承和實現繼承 ,而ECMAScript中無法實現接口繼承,ECMAScript只支持實現繼承,而且其實現繼承主要是依靠 原型鏈 來實現。

1.原型鏈

基本思想:利用原型讓一個引用類型繼承另外一個引用類型的屬性和方法。

構造函數,原型,實例之間的關系:每個構造函數都有一個原型對象,原型對象包含一個指向構造函數的指針,而實例都包含一個指向原型對象的內部指針。

原型鏈實現繼承例子:

function SuperType() {this.property = true;}SuperType.prototype.getSuperValue = function() {return this.property;}function subType() {this.property = false;}//繼承了SuperTypeSubType.prototype = new SuperType();SubType.prototype.getSubValue = function (){return this.property;}var instance = new SubType();console.log(instance.getSuperValue());//true

2.借用構造函數

基本思想:在子類型構造函數的內部調用超類構造函數,通過使用call()和apply()方法可以在新創建的對象上執行構造函數。

例子:

function SuperType() {this.colors = ["red","blue","green"];}function SubType() {SuperType.call(this);//繼承了SuperType}var instance1 = new SubType();instance1.colors.push("black");console.log(instance1.colors);//"red","blue","green","black"var instance2 = new SubType();console.log(instance2.colors);//"red","blue","green"

3.組合繼承

基本思想:將原型鏈和借用構造函數的技術組合在一塊,從而發揮兩者之長的一種繼承模式。

例子:

function SuperType(name) {this.name = name;this.colors = ["red","blue","green"];}SuperType.prototype.sayName = function() {console.log(this.name);}function SubType(name, age) {SuperType.call(this,name);//繼承屬性this.age = age;}//繼承方法SubType.prototype = new SuperType();Subtype.prototype.constructor = Subtype;Subtype.prototype.sayAge = function() {console.log(this.age);}var instance1 = new SubType("EvanChen",18);instance1.colors.push("black");consol.log(instance1.colors);//"red","blue","green","black"instance1.sayName();//"EvanChen"instance1.sayAge();//18var instance2 = new SubType("EvanChen666",20);console.log(instance2.colors);//"red","blue","green"instance2.sayName();//"EvanChen666"instance2.sayAge();//20

4.原型式繼承

基本想法:借助原型可以基于已有的對象創建新對象,同時還不必須因此創建自定義的類型。

原型式繼承的思想可用以下函數來說明:

function object(o) {function F(){}F.prototype = o;return new F();}

例子:

var person = {name:"EvanChen",friends:["Shelby","Court","Van"];};var anotherPerson = object(person);anotherPerson.name = "Greg";anotherPerson.friends.push("Rob");var yetAnotherPerson = object(person);yetAnotherPerson.name = "Linda";yetAnotherPerson.friends.push("Barbie");console.log(person.friends);//"Shelby","Court","Van","Rob","Barbie"

ECMAScript5通過新增Object.create()方法規范化了原型式繼承,這個方法接收兩個參數:一個用作新對象原型的對象和一個作為新對象定義額外屬性的對象。

var person = {name:"EvanChen",friends:["Shelby","Court","Van"];};var anotherPerson = Object.create(person);anotherPerson.name = "Greg";anotherPerson.friends.push("Rob");var yetAnotherPerson = Object.create(person);yetAnotherPerson.name = "Linda";yetAnotherPerson.friends.push("Barbie");console.log(person.friends);//"Shelby","Court","Van","Rob","Barbie"

5.寄生式繼承

基本思想:創建一個僅用于封裝繼承過程的函數,該函數在內部以某種方式來增強對象,最后再像真正是它做了所有工作一樣返回對象。

例子:

function createAnother(original) {var clone = object(original);clone.sayHi = function () {alert("hi");};return clone;}var person = {name:"EvanChen",friends:["Shelby","Court","Van"];};var anotherPerson = createAnother(person);anotherPerson.sayHi();///"hi"

6.寄生組合式繼承

基本思想:通過借用函數來繼承屬性,通過原型鏈的混成形式來繼承方法

其基本模型如下所示:

function inheritProperty(subType, superType) {var prototype = object(superType.prototype);//創建對象prototype.constructor = subType;//增強對象subType.prototype = prototype;//指定對象}

例子:

function SuperType(name){this.name = name;this.colors = ["red","blue","green"];}SuperType.prototype.sayName = function (){alert(this.name);};function SubType(name,age){SuperType.call(this,name);this.age = age;}inheritProperty(SubType,SuperType);SubType.prototype.sayAge = function() {alert(this.age);}

以上內容給大家介紹了javascript實現繼承的六種方式,希望對大家有所幫助!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 墨脱县| 墨江| 海阳市| 叶城县| 垣曲县| 湛江市| 远安县| 华宁县| 盘锦市| 姜堰市| 新绛县| 泽库县| 邛崃市| 漳平市| 乌拉特前旗| 时尚| 游戏| 霍邱县| 通渭县| 大冶市| 张掖市| 平顶山市| 赞皇县| 昌黎县| 彩票| 喜德县| 上林县| 宕昌县| 陆丰市| 廉江市| 姜堰市| 高台县| 新民市| 炎陵县| 阳高县| 莫力| 东明县| 邵阳县| 建始县| 惠来县| 南通市|