国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

一文讓你搞懂javascript如何實(shí)現(xiàn)繼承

這篇具有很好參考價(jià)值的文章主要介紹了一文讓你搞懂javascript如何實(shí)現(xiàn)繼承。希望對大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

一、本文想給你聊的東西包含一下幾個(gè)方面:(僅限于es6之前的語法哈,因?yàn)閑s6里面class這關(guān)鍵字用上了。。)

1.原型是啥?原型鏈?zhǔn)巧叮?/p>

2.繼承的通用概念。

3.Javascript實(shí)現(xiàn)繼承的方式有哪些?

?文章來源地址http://www.zghlxwxcb.cn/news/detail-439522.html

二、原型是啥?原型鏈?zhǔn)巧叮?/p>

1.原型是函數(shù)本身的prototype屬性。

首先js和java不一樣,js頂多算是一個(gè)基于對象的語言,而不是標(biāo)準(zhǔn)的面向?qū)ο蟮恼Z言。

所以我們談繼承,只能是基于new關(guān)鍵字作用域構(gòu)造函數(shù)的場景。

上代碼:

    function Person(name,age) {
        this.name = name;
        this.age = age;
    }

    console.log(Person.prototype);

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?代碼 1

一文讓你搞懂javascript如何實(shí)現(xiàn)繼承

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖1

?定義一個(gè)構(gòu)造函數(shù),默認(rèn)起原型就是一個(gè)Object對象,相當(dāng)于一個(gè)new Object()。

而且還有一個(gè)new出來的對象有一個(gè)隱式原型屬性__proto__,也指向了構(gòu)造函數(shù)的原型。

也就是說: Person.prototype? ?=== new Person().__proto__。

用圖來表示就是:

一文讓你搞懂javascript如何實(shí)現(xiàn)繼承

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 圖2

?

在上圖中,我把Object.prototype 叫rootObject,那么rootObject中就有了所有對象都共享的方法,如下圖:

一文讓你搞懂javascript如何實(shí)現(xiàn)繼承

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖3

?如果person.toString()方法調(diào)用,那么起自身沒有toString方法,就是走_(dá)_proto__指向的原型對象中找,而object中也沒有

所有就找到了根對象。所以構(gòu)造函數(shù)原型對象存在的意義是使得該構(gòu)造函數(shù)產(chǎn)生的對象可以共享屬性和方法。

所以原型對象中的屬性和方法就類似于java類中定義的static屬性和方法,所有對象都可以共享。

那么如上圖2所示,person? ->? object? -> rootObject之間就形成了原型鏈。

?

二、繼承的通用概念

如果一個(gè)類B繼承了類A,在java中這些寫:class B extends A{}??

那么類B就擁有了A中的所有屬性和方法。

繼承是面向?qū)ο缶幊痰囊淮筇匦?,目的很簡單,就是?fù)用。

?

三、javascript中實(shí)現(xiàn)繼承的方式有哪些?

1.原型鏈

假如有個(gè)構(gòu)造函數(shù)Student想要繼承Person函數(shù),想擁有Person中的屬性和方法,可以使用原型鏈來實(shí)現(xiàn)。

上代碼

// 定義Person
function Person(name,age) {
// 保證屬性有初始值
this.name = name ? name : "";
this.age = (age || age === 0) ? age : 0;
this.setName = function (name) {
this.name = name;
}
this.setAge = function (age) {
this.age = age;
}
this.getPersonInfo = function () {
return "[Person]: " + this.name + "_" + this.age;
}
}
// 定義一個(gè)所有Person對象都能共享的屬性和方法
Person.prototype.typeDesc = "人類";
Person.prototype.hello = function () {
console.log("hello");
}
function Student(score) {
this.score = score;
this.setScore = function (score) {
this.score = score;
}
this.getStudentInfo = function () {
return "[Student:]: " + this.score;
}
}
// 修改Student的原型
Student.prototype = new Person();

let student1 = new Student(90);
let student2 = new Student(80);
let student3 = new Student(70);

console.log(student1.typeDesc); // 能訪問

student1.setName("aa");
student1.setAge(99);
console.log(student1.getPersonInfo()); // 能訪問

console.log(student1.getStudentInfo()); // 能訪問

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 代碼2

給你一張圖吧? 更清楚

一文讓你搞懂javascript如何實(shí)現(xiàn)繼承

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?圖 4

?

老鐵,你思考下?雖然看似student1對象能訪問了能訪問了Person中定義的方法和屬性,但是有沒有問題呢?

?本來name,age是對象的私有屬性,不屬于“類級別”,但是他們卻出現(xiàn)在了Student的原型對象中,而且此時(shí)如果你

console.log(student2.name),發(fā)現(xiàn)其訪問到了原型person對象的name屬性了,是個(gè)初始的空字符串,這里為什么要在Person函數(shù)中使用初始值,

這個(gè)在工作中是很常見的,對象創(chuàng)建出來一般屬性都是需要初始值的。

所以原型鏈實(shí)現(xiàn)繼承,缺點(diǎn)是:原型對象中多出了一些沒必要的屬性。

而且由于student2和student3等其他Student的對象仍然能訪問到原型對象person中的屬性,這會讓人產(chǎn)生錯(cuò)覺,以為他們也擁有name,age的私有屬性。

于是,你接著看下面的方式。

?

2.復(fù)用構(gòu)造方法

這東西嚴(yán)格來講,我感覺不太像繼承,但是好像用起來還挺好用,起碼省事了。。。。

繼續(xù)哈,上代碼?。ǜ淖円幌麓a2)

    // 定義Person
    function Person(name,age) {
        // 保證屬性有初始值
        this.name = name ? name : "";
        this.age = (age || age === 0) ? age : 0;
        this.setName = function (name) {
            this.name = name;
        }
        this.setAge = function (age) {
            this.age = age;
        }
        this.getPersonInfo = function () {
            return "[Person]: " + this.name + "_" + this.age;
        }
    }
    // 定義一個(gè)所有Person對象都能共享的屬性和方法
    Person.prototype.typeDesc = "人類";
    Person.prototype.hello = function () {
        console.log("hello");
    }
    function Student(name, age, score) {
        // 使用call調(diào)用函數(shù),可以改變this指向,服用了父類的構(gòu)造方法
        Person.call(this, name,age);
        this.score = score;
        this.setScore = function (score) {
            this.score = score;
        }
        this.getStudentInfo = function () {
            return "[Student:]: " + this.score;
        }
    }
    let student1 = new Student("aa", 99, 99);
    console.log(student1.typeDesc);  // undefined
    console.log(student1.hello);   // undefined
    console.log(student1.getStudentInfo());  // 能訪問
    console.log(student1.getPersonInfo());   // 能訪問

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 代碼 3

此時(shí)雖然,雖然復(fù)用了Person構(gòu)造函數(shù),但是原型Person的原型student1無法訪問到。

缺點(diǎn)很明顯:雖然復(fù)用了Person的構(gòu)造函數(shù),但是卻沒有繼承Person的原型。

好了,我們演變一下。。

?

3.共享原型

基于上述代碼3,在Student函數(shù)后面加入如下代碼:

Student.prototype = Person.prototype;

                              ? 代碼 4

其實(shí)就是兩個(gè)構(gòu)造函數(shù)都指向同一原型。。

此時(shí)發(fā)現(xiàn),student1能訪問Person原型上的內(nèi)容了。

還是要問一下,這樣就行了嗎?

問題:一旦Student向原型里面加了變量或者函數(shù),或者修改原型中的變量內(nèi)容時(shí),哪怕是Person構(gòu)造出來的對象,

同樣也感知到了。。。。? 這樣互相影響的話,兩個(gè)構(gòu)造函數(shù)的原型中的變量和函數(shù)摻雜在一起,確實(shí)不合適?

那怎么辦呢?

來吧,看看下面的變種。

?

4.圣杯模式

說實(shí)話我也不知道為啥取名叫圣杯模式,感覺也不是官方的命名,有些人還叫其他名字。

把代碼4替換成如下代碼:

    // 定義空函數(shù)
    function F() {}
    // 空函數(shù)和Person共享原型
    F.prototype = Person.prototype;
    // 改變Student的原型
    Student.prototype = new F();
    // 添加原型上的構(gòu)造函數(shù)
    Student.prototype.constructor = Student;

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?代碼 5

這樣做Student的原型和Person的原型就不是一個(gè)對象了,而且不像原型鏈那樣,由于new Person()作為Student.prototype導(dǎo)致該原型對象中包含了Person對象的私有屬性。

來吧,給你個(gè)最終版本的代碼,希望能幫助到你,能力有限,相互借鑒哈。。

?

5.圣杯模式+復(fù)用構(gòu)造函數(shù)(算是比較完美了)

?

    // 定義Person
    function Person(name,age) {
        // 保證屬性有初始值
        this.name = name ? name : "";
        this.age = (age || age === 0) ? age : 0;
        this.setName = function (name) {
            this.name = name;
        }
        this.setAge = function (age) {
            this.age = age;
        }
        this.getPersonInfo = function () {
            return "[Person]: " + this.name + "_" + this.age;
        }
    }
    // 定義一個(gè)所有Person對象都能共享的屬性和方法
    Person.prototype.typeDesc = "人類";
    Person.prototype.hello = function () {
        console.log("hello");
    }
    function Student(name, age, score) {
        // 使用call調(diào)用函數(shù),可以改變this指向,服用了父類的構(gòu)造方法
        Person.call(this, name,age);
        this.score = score;
        this.setScore = function (score) {
            this.score = score;
        }
        this.getStudentInfo = function () {
            return "[Student:]: " + this.score;
        }
    }
    // 定義空函數(shù)
    function F() {}
    // 空函數(shù)和Person共享原型
    F.prototype = Person.prototype;
    // 改變Student的原型
    Student.prototype = new F();
    // 添加原型上的構(gòu)造函數(shù)
    Student.prototype.constructor = Student;


    let student1 = new Student("aa", 99, 99);
    console.log(student1.typeDesc);  // 人類
    student1.hello();   // hello
    console.log(student1.getStudentInfo());  // 能訪問
    console.log(student1.getPersonInfo());   // 能訪問

    let student2 = new Student("bb", 33, 88);
    student2.setScore(89);
    // student2和student1都各自有自己的私有屬性,并不會受影響。
    console.log(student1.getStudentInfo());
    console.log(student2.getStudentInfo());

    Student.prototype.temp = "新加屬性";
    console.log(Person.prototype.temp);  // undefined

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?代碼 6

總結(jié):可能我們在平常工作中很少這樣寫代碼,或者用到這種繼承模式,但是框架中很有可能會用到這些思想。

圣杯模式是共享原型模式的一個(gè)變種,使用空函數(shù)F來作為中間橋梁,巧妙得解決了共享原型模式的問題,同時(shí)

也解決了原型鏈模式的產(chǎn)生多余屬性的問題。

?

到了這里,關(guān)于一文讓你搞懂javascript如何實(shí)現(xiàn)繼承的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【C標(biāo)準(zhǔn)庫】詳解fopen函數(shù) 一篇讓你搞懂fopen函數(shù)

    創(chuàng)作不易,感謝支持!  ̄ underline{創(chuàng)作不易,感謝支持! } 創(chuàng)作不易,感謝支持! ? fopen函數(shù) 頭文件:stdio.h 功能是打開一個(gè)文件,其聲明格式是: 文件指針名 = fopen(文件名,使用文件方式) “文件名”是被打開文件的文件名,類型是C風(fēng)格字符串。 “使用文件方式”是指文

    2024年02月03日
    瀏覽(19)
  • Android 動(dòng)態(tài)分區(qū)詳解(一) 5 張圖讓你搞懂動(dòng)態(tài)分區(qū)原理

    Android 動(dòng)態(tài)分區(qū)詳解(一) 5 張圖讓你搞懂動(dòng)態(tài)分區(qū)原理

    本文主要包含動(dòng)態(tài)分區(qū)的物理數(shù)據(jù)布局,內(nèi)存核心數(shù)據(jù)結(jié)構(gòu)和動(dòng)態(tài)分區(qū)映射示例 3 個(gè)部分。 如果你對動(dòng)態(tài)分區(qū)沒啥概念,建議直接從頭閱讀 如果只關(guān)心動(dòng)態(tài)分區(qū)在設(shè)備上是如何存儲的,請?zhí)D(zhuǎn)到第 3 節(jié) 如果只關(guān)心動(dòng)態(tài)分區(qū)在內(nèi)存中的數(shù)據(jù)結(jié)構(gòu),請?zhí)D(zhuǎn)到第 4 節(jié) 如果想看動(dòng)態(tài)

    2023年04月08日
    瀏覽(22)
  • 一篇文章讓你搞懂TypeScript中的typeof()、keyof()是什么意思

    一篇文章讓你搞懂TypeScript中的typeof()、keyof()是什么意思

    知識專欄 專欄鏈接 TypeScript知識專欄 https://blog.csdn.net/xsl_hr/category_12030346.html?spm=1001.2014.3001.5482 有關(guān)TypeScript的相關(guān)知識可以前往TypeScript知識專欄查看復(fù)習(xí)!! 最近在 前端的深入學(xué)習(xí)過程 中,接觸了與 網(wǎng)絡(luò)請求 相關(guān)的內(nèi)容,于是計(jì)劃用三個(gè)專欄( HTTP 、 Axios 、 Ajax )和零碎

    2023年04月21日
    瀏覽(28)
  • Nginx配置詳解,一文帶你搞懂Nginx

    1 基本概念 1.1 Nginx簡介 Nginx是一個(gè)高性能的HTTP和反向代理服務(wù)器,特點(diǎn)是占用內(nèi)存少,并發(fā)能力強(qiáng),事實(shí)上Nginx的并發(fā)能力確實(shí)在同類型的網(wǎng)頁服務(wù)器中表現(xiàn)好。Nginx專為性能優(yōu)化而開發(fā),性能是其最重要的考量,實(shí)現(xiàn)上非常注重效率,能經(jīng)受高負(fù)載的考驗(yàn),有報(bào)告表明能支

    2024年01月16日
    瀏覽(22)
  • 一文帶你搞懂sklearn.metrics混淆矩陣

    一般的二分類任務(wù)需要的評價(jià)指標(biāo)有4個(gè) accuracy precision recall f1-score 四個(gè)指標(biāo)的計(jì)算公式如下 ? 計(jì)算這些指標(biāo)要涉及到下面這四個(gè)概念,而它們又構(gòu)成了混淆矩陣 TP (True Positive) FP (False Positive) TN (True Negative) FN (False Negative) 混淆矩陣 預(yù)測值 0 1 實(shí)際值 0 TN FP 1 FN TP 這里我給出的

    2024年02月06日
    瀏覽(23)
  • C/S、B/S架構(gòu)詳解,一文帶你搞懂

    C/S、B/S架構(gòu)詳解,一文帶你搞懂

    ? CS架構(gòu)(Client-Server Architecture)是一種分布式計(jì)算模型,其中客戶端和服務(wù)器之間通過網(wǎng)絡(luò)進(jìn)行通信。在這種架構(gòu)中,客戶端負(fù)責(zé)向服務(wù)器發(fā)送請求,并接收服務(wù)器返回的響應(yīng)。服務(wù)器則負(fù)責(zé)處理客戶端的請求,并返回相應(yīng)的結(jié)果。CS架構(gòu)通常用于構(gòu)建大型的網(wǎng)絡(luò)應(yīng)用程序,

    2024年02月16日
    瀏覽(16)
  • 一文帶你搞懂PyTorch中所有模型查看的函數(shù)model.modules()系列

    model一般繼承nn.Model 他的實(shí)例一般具有幾個(gè)有序 字典 , _modules,_parameters,_buffers,表示當(dāng)前model的子模塊,自己注冊的parameters和buffers 注意,_modules字典keys對應(yīng)子模塊名字,value對應(yīng)子模塊的實(shí)例,所以可以迭代的調(diào)用子模塊的子模塊,比如下面兩個(gè)函數(shù) 因?yàn)槭亲值?,所以?/p>

    2024年02月06日
    瀏覽(26)
  • 【微信小程序】一文帶你搞懂小程序的頁面配置和網(wǎng)絡(luò)數(shù)據(jù)請求

    【微信小程序】一文帶你搞懂小程序的頁面配置和網(wǎng)絡(luò)數(shù)據(jù)請求

    每個(gè)小程序頁面都有一個(gè) .json 文件,該文件用來對小程序的頁面進(jìn)行配置。 小程序中,每個(gè)頁面都有自己的.json配置文件,用來對當(dāng)前頁面的窗口外觀、頁面效果等進(jìn)行配置。 小程序中,app.json中的 window 節(jié)點(diǎn),可以全局配置小程序中 每個(gè)頁面 的窗口表現(xiàn)。 如:當(dāng)在app.js

    2024年02月02日
    瀏覽(28)
  • 【MDX】一文帶你搞懂SQL Server Analysis Services 的安裝和使用

    【MDX】一文帶你搞懂SQL Server Analysis Services 的安裝和使用

    目錄 Step 1: Install developer and management tools 安裝 new stand-alone SQL Server installation or add the feature to an existing installation 安裝 SQL Server Management Studio 安裝 SSDT 安裝 Visual Studio Step 2: Install databases Step 3: Install projects Step 4: 創(chuàng)建項(xiàng)目 Step 5: 定義數(shù)據(jù)源 Step 6: 部署Analysis Services項(xiàng)目 Step 7: F

    2023年04月08日
    瀏覽(24)
  • 讓你搞懂怎么解決LF、CRLF問題LF will be replaced by CRLF the next time Git touched it

    讓你搞懂怎么解決LF、CRLF問題LF will be replaced by CRLF the next time Git touched it

    大家好,我是小餅鵝,讓我們一起學(xué)習(xí)吧 ? 如果我們正在應(yīng)用的windows系統(tǒng)進(jìn)行開發(fā)工作的話,我們很有可能在對代碼進(jìn)行g(shù)it add 的時(shí)候會看到以下warning: LF will be replaced by CRLF the next time Git touched it 很多人可能并不會特別在意,因?yàn)樗菜撇]有對我們產(chǎn)生什么影響,可是真

    2024年02月09日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包