摘要:原型鏈實(shí)現(xiàn)繼承例子繼承了借用構(gòu)造函數(shù)基本思想在子類(lèi)型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類(lèi)構(gòu)造函數(shù),通過(guò)使用和方法可以在新創(chuàng)建的對(duì)象上執(zhí)行構(gòu)造函數(shù)。
前言:大多OO語(yǔ)言都支持兩種繼承方式:接口繼承和實(shí)現(xiàn)繼承,而ECMAScript中無(wú)法實(shí)現(xiàn)接口繼承,ECMAScript只支持實(shí)現(xiàn)繼承,而且其實(shí)現(xiàn)繼承主要是依靠原型鏈來(lái)實(shí)現(xiàn)。
1.原型鏈基本思想:利用原型讓一個(gè)引用類(lèi)型繼承另外一個(gè)引用類(lèi)型的屬性和方法。
構(gòu)造函數(shù),原型,實(shí)例之間的關(guān)系:每個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型對(duì)象包含一個(gè)指向構(gòu)造函數(shù)的指針,而實(shí)例都包含一個(gè)指向原型對(duì)象的內(nèi)部指針。
原型鏈實(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());//true2.借用構(gòu)造函數(shù)
基本思想:在子類(lèi)型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類(lèi)構(gòu)造函數(shù),通過(guò)使用call()和apply()方法可以在新創(chuàng)建的對(duì)象上執(zhí)行構(gòu)造函數(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.組合繼承
基本思想:將原型鏈和借用構(gòu)造函數(shù)的技術(shù)組合在一塊,從而發(fā)揮兩者之長(zhǎng)的一種繼承模式。
例子:
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();//204.原型式繼承
基本想法:借助原型可以基于已有的對(duì)象創(chuàng)建新對(duì)象,同時(shí)還不必須因此創(chuàng)建自定義的類(lèi)型。
原型式繼承的思想可用以下函數(shù)來(lái)說(shuō)明:
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通過(guò)新增Object.create()方法規(guī)范化了原型式繼承,這個(gè)方法接收兩個(gè)參數(shù):一個(gè)用作新對(duì)象原型的對(duì)象和一個(gè)作為新對(duì)象定義額外屬性的對(duì)象。
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)建一個(gè)僅用于封裝繼承過(guò)程的函數(shù),該函數(shù)在內(nèi)部以某種方式來(lái)增強(qiáng)對(duì)象,最后再像真正是它做了所有工作一樣返回對(duì)象。
例子:
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.寄生組合式繼承
基本思想:通過(guò)借用函數(shù)來(lái)繼承屬性,通過(guò)原型鏈的混成形式來(lái)繼承方法
其基本模型如下所示:
function inheritProperty(subType, superType) { var prototype = object(superType.prototype);//創(chuàng)建對(duì)象 prototype.constructor = subType;//增強(qiáng)對(duì)象 subType.prototype = prototype;//指定對(duì)象 }
例子:
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); }
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/79053.html
摘要:基于原型的繼承原型上的屬性被共享了不是我們所需要的這種繼承會(huì)有如下的缺點(diǎn)如果父類(lèi)包含有引用類(lèi)型的屬性所有的子類(lèi)就會(huì)共享這個(gè)屬性。 基于原型的繼承 function father() { this.faName = father; this.names=[11,22] } father.prototype.getfaName = fun...
摘要:使用最多的繼承模式是組合繼承,這種模式使用原型鏈繼承共享的屬性和方法,而借用構(gòu)造函數(shù)繼承實(shí)例屬性。原型式繼承,可以在不必預(yù)先定義構(gòu)造函數(shù)的情況下實(shí)現(xiàn)繼承,其本質(zhì)是執(zhí)行給定對(duì)象的淺復(fù)制。 1、原型鏈實(shí)現(xiàn)繼承 function SuperType() { this.property = true; } SuperType.prototype.getSuperValue = func...
摘要:原型繼承缺點(diǎn)子類(lèi)實(shí)例共享屬性,造成實(shí)例間的屬性會(huì)相互影響可以看到子類(lèi)的實(shí)例屬性皆來(lái)自于父類(lèi)的一個(gè)實(shí)例,即子類(lèi)共享了同一個(gè)實(shí)例共享了父類(lèi)的方法構(gòu)造函數(shù)繼承缺點(diǎn)父類(lèi)的方法沒(méi)有被共享,造成內(nèi)存浪費(fèi)子實(shí)例的屬性都是相互獨(dú)立的實(shí)例方法也是獨(dú)立的,沒(méi)有 原型繼承 缺點(diǎn): 子類(lèi)實(shí)例共享屬性,造成實(shí)例間的屬性會(huì)相互影響 function Parent1() { this.name = [super...
摘要:實(shí)現(xiàn)繼承的方法借用構(gòu)造函數(shù)解決原型中包含引用類(lèi)型所帶來(lái)的問(wèn)題的過(guò)程中,使用借用構(gòu)造函數(shù)偽造對(duì)象或經(jīng)典繼承來(lái)實(shí)現(xiàn)繼承。 繼承 在ECMAScript中繼承主要是依靠原型鏈來(lái)實(shí)現(xiàn)的。 實(shí)現(xiàn)繼承的方法 利用原型讓一個(gè)引用類(lèi)型繼承另一個(gè)引用類(lèi)型的屬性和方法 什么是原型鏈 先要了解構(gòu)造函數(shù)、原型、和實(shí)例的關(guān)系: 每一個(gè)構(gòu)造函數(shù)都有一個(gè)原型對(duì)象,原型對(duì)象都包含一個(gè)指向構(gòu)造函數(shù)的指針,實(shí)例都包含...
摘要:在之前的總結(jié)中,我們?cè)敿?xì)分析了原型總結(jié)之原型,原型很大作用用于模擬繼承,這一次,我們來(lái)聊原型繼承的幾種方式。 showImg(https://segmentfault.com/img/bVblosF?w=1600&h=640); 在之前的總結(jié)中,我們?cè)敿?xì)分析了原型《JS 總結(jié)之原型》,原型很大作用用于模擬繼承,這一次,我們來(lái)聊原型繼承的幾種方式。 function Person (ag...
閱讀 3420·2021-09-22 16:00
閱讀 3462·2021-09-07 10:26
閱讀 3018·2019-08-30 15:55
閱讀 2866·2019-08-30 13:48
閱讀 1376·2019-08-30 12:58
閱讀 2175·2019-08-30 11:15
閱讀 956·2019-08-30 11:08
閱讀 532·2019-08-29 18:41