摘要:類式繼承原型鏈繼承實(shí)現(xiàn)我是的方法我是的方法由于的實(shí)例能夠訪問,所以我們可以設(shè)置指向的實(shí)例。所以的實(shí)例可以訪問的實(shí)例以及,實(shí)現(xiàn)繼承缺點(diǎn)由于對(duì)象類型的賦值是引用賦值,如果父類實(shí)例化過程中有引用類型,那么子類的實(shí)例的這個(gè)屬性都指向同一內(nèi)存空間。
類式繼承(原型鏈繼承) 實(shí)現(xiàn)
function A(){ this.a="a"; this.arr=[1,2]; } A.prototype.funA=function(){ console.log("我是A的方法"); } function B(){ this.b="b"; } B.prototype.funB=function(){ console.log("我是B的方法"); } B.prototype=new A(); var b1=new B();
由于A的實(shí)例能夠訪問A.prototype,所以我們可以設(shè)置B.prototype指向A的實(shí)例。所以B的實(shí)例可以訪問A的實(shí)例以及A.prototype,實(shí)現(xiàn)繼承
缺點(diǎn):1.由于對(duì)象類型的賦值是引用賦值,如果父類A實(shí)例化過程中有引用類型,那么子類B的實(shí)例的這個(gè)屬性都指向同一內(nèi)存空間。
function A(){ this.a="a"; this.arr=[1,2]; } A.prototype.funA=function(){ console.log("我是A的方法"); } function B(){ this.b="b"; } B.prototype.funB=function(){ console.log("我是B的方法"); } B.prototype=new A(); var b1=new B(); var b2=new B(); b1.arr.push(3); console.log(b1.arr); // [1, 2, 3] console.log(b2.arr); // [1, 2, 3]
2.如果父類的實(shí)例需要傳入一些參數(shù),那么兩個(gè)子類實(shí)例初始化時(shí)某一屬性值相同
function A(year){ this.year=year; } function B(){ this.b="b"; } B.prototype=new A(18); var b1=new B(); var b2=new B(); console.log(b1.color); // 18 console.log(b2.color); // 18
3.B.prototype中constructor指向不正確,因?yàn)?b>B.prototype指向了一個(gè)A的實(shí)例,所以本應(yīng)指向B的constructor指向了A
function A(year){ this.year=year; } function B(){ this.b="b"; } B.prototype=new A(18); var b1=new B(); b1.constructor===A // true構(gòu)造函數(shù)繼承(借用構(gòu)造函數(shù)繼承) 實(shí)現(xiàn)
function A(color){ this.a="a"; this.arr=[1,2]; this.color=color; } A.prototype.funA=function(){ console.log("我是A的方法"); } function B(color){ A.call(this,color); } B.prototype.funB=function(){ console.log("我是B的方法"); } var b1=new B("red"); console.log(b1) // {a: "a", arr: Array(2), color: "red"}優(yōu)點(diǎn)
解決了引用賦值問題,也可以自定義一些屬性了,constructor也指向B了,即解決了類式繼承的第一個(gè)、第二個(gè)問題以及第三個(gè)問題
缺點(diǎn)很明顯,B除了調(diào)用了A這個(gè)函數(shù)外并沒有和A扯上什么關(guān)系,原型鏈?zhǔn)遣煌ǖ?無法訪問到應(yīng)該作為父類的A的prototype屬性),我甚至并不覺得這是一種繼承方式,但它為下面兩種方法奠定了基礎(chǔ)
b1.__proto__===B.prototype // true b1.__proto__.__proto__===Object.prototype // true組合繼承
說白了,就是將上述兩種方法的長處組合到一起,利用原型鏈實(shí)現(xiàn)原型屬性和方法的繼承,通過借用構(gòu)造函數(shù)實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承
實(shí)現(xiàn)function A(color){ this.a="a"; this.arr=[1,2]; this.color=color; } A.prototype.funA=function(){ console.log("我是A的方法"); } function B(color,age){ // 通過借用構(gòu)造函數(shù)實(shí)現(xiàn)對(duì)實(shí)例屬性的繼承 A.apply(this,[color]); this.age=age; } // 利用原型鏈實(shí)現(xiàn)原型屬性和方法的繼承 B.prototype=new A(); B.prototype.constructor=B; var b1=new B("red",18);優(yōu)點(diǎn)
既通過在原型上定義方法實(shí)現(xiàn)了函數(shù)復(fù)用,又能夠保證每個(gè)實(shí)例都有它自己的屬性
缺點(diǎn)調(diào)用了兩次父類的構(gòu)造函數(shù)
寄生組合式繼承(此方法最好) 實(shí)現(xiàn)function A(color){ this.a="a"; this.arr=[1,2]; this.color=color; } A.prototype.funA=function(){ console.log("我是A的方法"); } function B(color,age){ A.apply(this,[color]); this.age=age; } B.prototype=Object.create(A.prototype); B.prototype.constructor=B; var b1=new B("red",18);優(yōu)點(diǎn)
只需訪問一次父類的構(gòu)造函數(shù),避免了在子類的prototype上創(chuàng)建不必要、多余的屬性
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/93928.html
摘要:注意基本變量類型不是對(duì)象類型,只有基本包裝類型才是對(duì)象類型。至于顯示的原型,在里用屬性表示,這個(gè)是原型繼承的基礎(chǔ)知識(shí),在這里就不在敘述了。 前言 如果你要開發(fā)一個(gè)復(fù)雜的產(chǎn)品,那么肯定少不了使用面向?qū)ο髾C(jī)制,當(dāng)然也避不開 Javascript 里面的繼承,instanceof 運(yùn)算符是原生 Javascript 語言中用來判斷實(shí)例繼承的操作符。所以我們有必要深入理解該運(yùn)算符! inst...
這是 最近在學(xué)習(xí)js繼承時(shí)看了多篇文章以及自我總結(jié)的學(xué)習(xí)筆記。 目錄:一:原型鏈二:構(gòu)造函數(shù)三:原型鏈和構(gòu)造函數(shù)組合繼承四:原型式五:寄生式六:寄生組合式 1、原型鏈 function Super(){ this.name = lily; this.age = 21; this.arr = [1,2,3] } function Sub(){} Sub.prototype = new S...
摘要:函數(shù)的調(diào)用有以下幾種方式作為對(duì)象方法調(diào)用,作為函數(shù)調(diào)用,作為構(gòu)造函數(shù)調(diào)用,和使用或調(diào)用。并且規(guī)范中說明,只有對(duì)象實(shí)現(xiàn)了方法。使用了回到上面作為構(gòu)造函數(shù)調(diào)用第一步創(chuàng)建一個(gè)空的對(duì)象,。第二步鏈接該對(duì)象即設(shè)置該對(duì)象的構(gòu)造函數(shù)到另一個(gè)對(duì)象,即。 在src/core/instance/index.js中 if (process.env.NODE_ENV !== production && !(t...
摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關(guān)系那么圖中所有的虛線將構(gòu)成一個(gè)繼承層級(jí),而實(shí)線表示屬性引用。原型鏈?zhǔn)菍?shí)現(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個(gè)問題,在面試中,很多同學(xué)經(jīng)常都會(huì)遇到。這里給大家講講,方便大家記憶。 JavaScript的特點(diǎn)JavaScript是一門直譯式腳本...
摘要:之前有朋友問怎么去理解原型和原型鏈的問題。理解原型鏈的小技巧將箭頭視作泛化子類到父類關(guān)系那么圖中所有的虛線將構(gòu)成一個(gè)繼承層級(jí),而實(shí)線表示屬性引用。原型鏈?zhǔn)菍?shí)現(xiàn)繼承的重要方式,原型鏈的形成是真正是靠而非。 之前有朋友問怎么去理解原型和原型鏈的問題。這個(gè)問題,在面試中,很多同學(xué)經(jīng)常都會(huì)遇到。這里給大家講講,方便大家記憶。 JavaScript的特點(diǎn)JavaScript是一門直譯式腳本...
閱讀 3115·2023-04-25 15:02
閱讀 2806·2021-11-23 09:51
閱讀 2030·2021-09-27 13:47
閱讀 1984·2021-09-13 10:33
閱讀 957·2019-08-30 15:54
閱讀 2640·2019-08-30 15:53
閱讀 2853·2019-08-29 13:58
閱讀 881·2019-08-29 13:54