国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

js面向?qū)ο鬁\談(三)

awkj / 2572人閱讀

摘要:還有一個(gè)問題,就是不能在創(chuàng)建子類性時(shí),像父類型的構(gòu)造函數(shù)傳遞參數(shù)。組合繼承將原型鏈和借用構(gòu)造函數(shù)組合到一起,發(fā)揮兩者之長(zhǎng)的一張繼承模式,下面來(lái)看個(gè)例子。組合繼承最大的問題是無(wú)論在什么情況下,都會(huì)調(diào)用兩次父類型構(gòu)造函數(shù)。

繼承

繼承是面向?qū)ο笳Z(yǔ)言中特別重要的概念,js的繼承主要是靠原型鏈實(shí)現(xiàn)的。

原型鏈!!!

看到我給標(biāo)題打了三個(gè)嘆號(hào)嗎,這里真的很重要!這里真的很重要!這里真的很重要!js描述了原型鏈的概念,并將原型鏈做為實(shí)現(xiàn)繼承的主要方法,其基本思想是讓一個(gè)引用類型繼承另一個(gè)引用類型的屬性和方法。看代碼

function SuperType() {
    this.property = true;
}

SuperType.prototype.getSuperValue = function () {
    return this.property;
}

function SubType () {
    this.Subproperty = false;
}

SubType.prototype = new SuperType();

SuperType.prototype.getSubValue = function () {
    return this.subproperty;
}

var instance = new SubType();
console.log(instance.getSuperValue())

下面繼續(xù)上我的靈魂畫作:


話不多說,原理都在圖里,相信聰明的你們?cè)缇投恕T谏厦娴拇a中,我們沒有使用SubType默認(rèn)提供的原型,而是給它換了一個(gè)新原型。這個(gè)原型是父類的實(shí)例,新原型具有全部屬性和方法,現(xiàn)在也存在于子類的原型中了。

通過原型鏈,本質(zhì)上擴(kuò)展了原型搜索機(jī)制。在instance.getSuperValue()調(diào)用會(huì)經(jīng)歷三個(gè)搜索步驟

搜索實(shí)例

搜索原型對(duì)象

搜索父類原型對(duì)象

一環(huán)一環(huán)向上搜索直到原型鏈末端才會(huì)停下來(lái)。但是我們子類上的valueOf這些方法是哪里來(lái)的呢?父類并沒有顯示聲明這些方法啊下面繼續(xù)上圖。

SubType繼承了SuperType,SuperType繼承了Object,當(dāng)調(diào)用instance.valueOf()方法時(shí),實(shí)際上調(diào)用的是保存在Object.prototype中的方法。

原型鏈的問題

原型鏈這么強(qiáng)大,同樣也會(huì)造成問題。最主要的問題來(lái)自于包含引用類型的原型。引用類型的原型屬性會(huì)被雖有實(shí)例共享,在通過原型來(lái)實(shí)現(xiàn)繼承時(shí),原型會(huì)變成另一個(gè)類型的實(shí)例,原先的實(shí)例屬性也就順理成章變成來(lái)現(xiàn)在的原型屬性。

function SuperType () {
    this.colors = ["red", "blue", "green"];
}

function SubType () {
    
}


SubType.prototype = new SuperType();

var instance1 = new SubType();

instance1.colors.push("black");

console.log(instance1.colors)

var instance2 = new SubType();

console.log(instance2.colors)

還有一個(gè)問題,就是不能在創(chuàng)建子類性時(shí),像父類型的構(gòu)造函數(shù)傳遞參數(shù)。所以我們一般很少多帶帶使用原型鏈。

借用構(gòu)造函數(shù)
function SuperType () {
    this.colors = ["red", "blue", "green"];
}

function SubType () {
    // 繼承了 SuperType
    SuperType.call(this);
}

var instance1 = new SubType();

instance1.colors.push("black");

console.log(instance1.colors);


var instance2 = new SubType();
console.log(instance2.colors);

也可以傳遞參數(shù)

 function SuperType (name) {
    this.name = name;
}

function SubType () {
    // 繼承了 SuperType
    SuperType.call(this, "李小花");
}

var instance1 = new SubType();
console.log(instance1.name)
但是這樣問題也很明顯,方法只能定義在構(gòu)造函數(shù)中定義,定義在原型上的方法無(wú)法繼承。借用構(gòu)造函數(shù)的技術(shù)也很少使用。

組合繼承
將原型鏈和借用構(gòu)造函數(shù)組合到一起,發(fā)揮兩者之長(zhǎng)的一張繼承模式,下面來(lái)看個(gè)例子。

   function SuperType (name) {
    this.name = name;
}

SuperType.prototype.sayName = function() {
    console.log(this.name)
};

function SubType (name, age) {
    // 繼承了 SuperType
    SuperType.call(this, name);

    this.age = age;
}
SubType.prototype = new SuperType();

var instance1 = new SubType();
console.log(instance1.name)


組合繼承是 js最常用的繼承模式。

寄生組合式繼承

組合繼承是最常用的繼承模式,但也不是沒有缺點(diǎn)。組合繼承最大的問題是無(wú)論在什么情況下,都會(huì)調(diào)用兩次父類型構(gòu)造函數(shù)。

 function SuperType (name) {
    this.name = name;
}

SuperType.prototype.sayName = function() {
    console.log(this.name)
};

function SubType (name, age) {
    // 繼承了 SuperType
    SuperType.call(this, name);  //第二次調(diào)用

    this.age = age;
}
SubType.prototype = new SuperType();  // 第一次調(diào)用

var instance1 = new SubType();
console.log(instance1.name)

我們不必為了指定子類型的原型調(diào)用超類型的構(gòu)造函數(shù),我們所需要的不過是超類型原型的一個(gè)副本而已。

function SuperType (name) {
    this.name = name;
    this.color = ["red", "blue", "green"];
}

SuperType.prototype.sayName = function() {
    console.log(this.name);
};

function SubType (name, age) {
    SuperType.call(this, name);
    this.age = age;
}

SubType.prototype = Object.create(SuperType.prototype);

SubType.prototype.constructor = SubType

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/83499.html

相關(guān)文章

  • 淺談PHP面向對(duì)象編程

    摘要:一面向?qū)ο缶幊袒A(chǔ)實(shí)踐通過對(duì)象的編程方式,可將實(shí)現(xiàn)生活中的一切事物以對(duì)象的形式表現(xiàn)出來(lái)。此時(shí)程序也將會(huì)報(bào)致命錯(cuò)誤。屬性不可訪問或未定義,值判斷對(duì)象中的屬性不存在時(shí),自動(dòng)執(zhí)行該函數(shù)。屬性值未定義釋放對(duì)象中的不存在的屬性值時(shí),自動(dòng)執(zhí)行該函數(shù)。 一、PHP面向?qū)ο缶幊袒A(chǔ)實(shí)踐 二、PHP面向?qū)ο蟾呒?jí)編程實(shí)踐 知識(shí)點(diǎn):類的繼承、方法重寫、訪問控制、static關(guān)鍵字、final關(guān)鍵字、數(shù)據(jù)訪...

    DrizzleX 評(píng)論0 收藏0
  • js面向對(duì)象淺談(一)

    摘要:引言對(duì)于面向?qū)ο螅嘈糯蠹乙欢ú荒吧?chuàng)建對(duì)象面向?qū)ο蟮谝徊绞鞘裁创饎?chuàng)建對(duì)象。構(gòu)造函數(shù)優(yōu)于工廠模式也是在于它可以通過辨識(shí)出一類的對(duì)象。 引言 對(duì)于面向?qū)ο螅嘈糯蠹乙欢ú荒吧W罱戳艘恍╆P(guān)于es6面向?qū)ο蟮闹R(shí),正好通過這篇文章把關(guān)于面向?qū)ο蟮臇|西給串起來(lái)分享給大家。 什么是對(duì)象 很多人會(huì)鄙視我,說你這篇文章是騙騙剛?cè)胄械男∨笥训陌桑裁词菍?duì)象我還能不知道?罵我的吃瓜群眾先冷靜一下,...

    lastSeries 評(píng)論0 收藏0
  • 淺談面向對(duì)象的javascript幾個(gè)特性

    摘要:中的和是一門很靈活的語(yǔ)言,尤其是。即然是面向?qū)ο蟮木幊陶Z(yǔ)言,那也是不可或缺的。在中,永遠(yuǎn)指向的是他的調(diào)用者。定義是存在于實(shí)例化后對(duì)象的一個(gè)屬性,并且指向原對(duì)象的屬性。我們?cè)跀U(kuò)展的時(shí)候,同時(shí)父類也會(huì)有對(duì)應(yīng)的方法,這很顯然是一個(gè)很嚴(yán)重的問題。 javascript中的this和new javascript是一門很靈活的語(yǔ)言,尤其是function。他即可以以面向過程的方式來(lái)用,比如: f...

    JayChen 評(píng)論0 收藏0
  • js面向對(duì)象淺談(二)

    摘要:我們通過這個(gè)構(gòu)造函數(shù)為原型對(duì)象添加其他方法和屬性。這個(gè)屬性存在與實(shí)例與構(gòu)造函數(shù)的原型對(duì)象上直接,而不存在于實(shí)例與構(gòu)造函數(shù)之間。李小花班花張全蛋張全蛋李小花李小花我們?cè)诒闅v對(duì)象的的屬性的時(shí)候,經(jīng)常需要判斷屬性是否來(lái)自于對(duì)象的原型還是屬性。 引言 上面說了創(chuàng)建對(duì)象有字面量方式和工廠模式還有構(gòu)造函數(shù)模式,結(jié)果發(fā)現(xiàn)他們都各自有缺點(diǎn),所以下面再給大家介紹幾種創(chuàng)建對(duì)象的方式,爭(zhēng)取能找到一種無(wú)痛的模...

    Yuanf 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

awkj

|高級(jí)講師

TA的文章

閱讀更多
最新活動(dòng)
閱讀需要支付1元查看
<