摘要:的構(gòu)造函數(shù)是什么它是一個普通的函數(shù)它內(nèi)部用了關(guān)鍵字它有一個屬性,這個是一個對象當然,其實每一個函數(shù)都有屬性這個上面是可以被繼承的屬性可被繼承的屬性以上是一個從原型對象生成實例對象的例子。
1: JavaScript的構(gòu)造函數(shù)是什么?
1: 它是一個普通的函數(shù)
2: 它內(nèi)部用了this關(guān)鍵字
3: 它有一個prototype屬性,這個prototype是一個對象(當然,其實每一個函數(shù)都有prototype屬性)
4: 這個prototype上面是可以被繼承的屬性
function Apple(price, colour){ this.price = price; this.colour = colour; } Apple.prototype.type = "fruit"; //可被繼承的屬性 var appleRed = new Apple(10, "red"); var appleGreen = new Apple(20, "green"); appleRed.colour;//red appleGreen.colour;//green appleRed.type; //fruit appleGreen.type;//fruit
以上是一個從原型對象(Apple)生成實例對象(appleGreen, appleRed)的例子。接下來看看基于構(gòu)造函數(shù)繼承:
首先假設有兩個構(gòu)造函數(shù):
function Fruit(){ this.taste = "sweet"; } function Apple(color){ this.color = "red" }
我們希望Apple能繼承Fruit,怎么做?總共有5種繼承方法:
1: 構(gòu)造函數(shù)綁定
在子構(gòu)造函數(shù)中,在父構(gòu)造器身上調(diào)用call或者apply方法
function Fruit(){ this.taste = "sweet"; } function Apple(color){ Fruit.apply(this, arguments); this.color = "red" } var appleRed = new Apple("red"); appleRed.taste;// "sweet"
2: prototype賦值
實例化一個父對象,然后把它賦給子構(gòu)造函數(shù)的prototype屬性
function Fruit(){ this.taste = "sweet"; } function Apple(color){ this.color = "red" } Apple.prototype = new Fruit(); Apple.prototype.constructor = Apple;//特別注意這一行 var appleRed = new Apple("red"); appleRed.taste;//"sweet" appleRed.constructor === Apple;//true
每一個實例都有一個constructor,繼承自構(gòu)造函數(shù)的prototype的constructor屬性。在執(zhí)行了
Apple.prototype = new Fruit();
之后,相當于是把Apple的prototype這個對象整個覆蓋了,這個時候 Apple.prototype.constructor是Fruit這個方法。這樣子就意味這appleRed.constructor也是Fruit,這樣繼承就混亂了,因為appleRed明明是由Apple這個構(gòu)造方法實例化出來的。所以我們要把Apple正確的constructor重新設置回去:
Apple.prototype.constructor = Apple;
3: 把父構(gòu)造函數(shù)的prototype直接賦給子構(gòu)造函數(shù)的prototype
function Fruit(){} Fruit.prototype.taste = "sweet"; function Apple(color){ this.color = "red" } Apple.prototype = Fruit.prototype; Apple.prototype.constructor = Apple; var appleRed = new Apple("red"); appleRed.taste;//"sweet" Fruit.prototype.constructor === Apple;//true
雖然實現(xiàn)了繼承,但是現(xiàn)在Apple和Fruit的prototype指向了同一段內(nèi)存,任何對Apple.prototype的修改都會影響到Fruit.prototype,所以代碼最后一行的這種結(jié)果,是我們不愿意看到的。
4: 利用一個空的中介構(gòu)造函數(shù)
其實第四種是第二種和第三種的結(jié)合
function Fruit(){} Fruit.prototype.taste = "sweet"; function Apple(color){ this.color = "red" } var F = function(){}; F.prototype = Fruit.prototype; Apple.prototype = new F(); Apple.prototype.constructor = Apple; var appleRed = new Apple("red"); appleRed.taste;//"sweet" appleRed.constructor === Apple;//true
1: 中介構(gòu)造函數(shù)的prototype=父構(gòu)造函數(shù)的prototype;
2: 子構(gòu)造函數(shù)的prototype=中介構(gòu)造函數(shù)的一個實例;
3: 把子構(gòu)造函數(shù)的constructor復原為自己
5: copy繼承
就是把父構(gòu)造函數(shù)的prototype上的所有屬性和方法拷貝進子構(gòu)造方法。
function Fruit(){} Fruit.prototype.taste = "sweet"; function Apple(color){ this.color = "red" } function extend(child, parent){ var c = child.prototype; var p = parent.prototype; for(var i in p){ c[i] = p[i] } } extend(Apple, Fruit);//調(diào)用繼承方法 var appleRed = new Apple("red"); appleRed.taste;//"sweet"
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/83521.html
摘要:首先,需要來理清一些基礎的計算機編程概念編程哲學與設計模式計算機編程理念源自于對現(xiàn)實抽象的哲學思考,面向?qū)ο缶幊淌瞧湟环N思維方式,與它并駕齊驅(qū)的是另外兩種思路過程式和函數(shù)式編程。 JavaScript 中的原型機制一直以來都被眾多開發(fā)者(包括本人)低估甚至忽視了,這是因為絕大多數(shù)人沒有想要深刻理解這個機制的內(nèi)涵,以及越來越多的開發(fā)者缺乏計算機編程相關(guān)的基礎知識。對于這樣的開發(fā)者來說 J...
摘要:這正是我們想要的太棒了毫不意外的,這種繼承的方式被稱為構(gòu)造函數(shù)繼承,在中是一種關(guān)鍵的實現(xiàn)的繼承方法,相信你已經(jīng)很好的掌握了。 你應該知道,JavaScript是一門基于原型鏈的語言,而我們今天的主題 -- 繼承就和原型鏈這一概念息息相關(guān)。甚至可以說,所謂的原型鏈就是一條繼承鏈。有些困惑了嗎?接著看下去吧。 一、構(gòu)造函數(shù),原型屬性與實例對象 要搞清楚如何在JavaScript中實現(xiàn)繼承,...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
摘要:很多情況下,通常一個人類,即創(chuàng)建了一個具體的對象。對象就是數(shù)據(jù),對象本身不包含方法。類是相似對象的描述,稱為類的定義,是該類對象的藍圖或原型。在中,對象通過對類的實體化形成的對象。一類的對象抽取出來。注意中,對象一定是通過類的實例化來的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 1911·2021-11-22 14:44
閱讀 1676·2021-11-02 14:46
閱讀 3664·2021-10-13 09:40
閱讀 2604·2021-09-07 09:58
閱讀 1611·2021-09-03 10:28
閱讀 1664·2019-08-29 15:30
閱讀 983·2019-08-29 15:28
閱讀 1474·2019-08-26 12:20