JavaScript是如何實現(xiàn)繼承的(六種方式)
來源:易賢網 閱讀:726 次 日期:2016-07-14 15:31:21
溫馨提示:易賢網小編為您整理了“JavaScript是如何實現(xiàn)繼承的(六種方式)”,方便廣大網友查閱!

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

1.原型鏈

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

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

原型鏈實現(xiàn)繼承例子:

function SuperType() {

this.property = true;

}

SuperType.prototype.getSuperValue = function() {

return this.property;

}

function subType() {

this.property = false;

}

//繼承了SuperType

SubType.prototype = new SuperType();

SubType.prototype.getSubValue = function (){

return this.property;

}

var instance = new SubType();

console.log(instance.getSuperValue());//true

2.借用構造函數(shù)

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

例子:

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.組合繼承

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

例子:

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();//18

var instance2 = new SubType("EvanChen666",20);

console.log(instance2.colors);//"red","blue","green"

instance2.sayName();//"EvanChen666"

instance2.sayAge();//20

4.原型式繼承

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

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

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()方法規(guī)范化了原型式繼承,這個方法接收兩個參數(shù):一個用作新對象原型的對象和一個作為新對象定義額外屬性的對象。

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.寄生式繼承

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

例子:

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.寄生組合式繼承

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

其基本模型如下所示:

function inheritProperty(subType, superType) {

var prototype = object(superType.prototype);//創(chuàng)建對象

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實現(xiàn)繼承的六種方式,希望對大家有所幫助!

更多信息請查看網絡編程

2025國考·省考課程試聽報名

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯(lián)系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網