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

資訊專欄INFORMATION COLUMN

js原型鏈

NervosNetwork / 2112人閱讀

摘要:構(gòu)造函數(shù),實(shí)例,原型三者的關(guān)系如下圖構(gòu)造函數(shù)是構(gòu)成整個(gè)原型鏈的關(guān)鍵,是他利用將原型傳給了后代。因此,通過(guò)操縱構(gòu)造函數(shù)的,就能夠操縱原型鏈,從而對(duì)原型鏈進(jìn)行自在的拼接。

要理解js的原型鏈主要就是理清楚以下三者的關(guān)系:

構(gòu)造函數(shù)的protitype屬性

對(duì)象的__proto__屬性

對(duì)象的constructor屬性

在js中,函數(shù)作為一等公民,它是一個(gè)對(duì)象,可以擁有自己的屬性,可以像其他類型(比如string)一樣作為參數(shù)進(jìn)行傳遞,作為返回值進(jìn)行返回。

我們首先寫一個(gè)名為Animal的函數(shù)。我們將從這個(gè)Animal函數(shù)開(kāi)始,通過(guò)原型鏈,構(gòu)建一條“動(dòng)物-狗-警犬”的繼承關(guān)系。

 function Animal() {}

首先把目光放在這個(gè)Animal函數(shù)身上。這是一個(gè)普通的空函數(shù),當(dāng)函數(shù)被關(guān)鍵字new調(diào)用時(shí),我們就說(shuō)他此刻是作為一個(gè)構(gòu)造函數(shù),通常用首字母大寫表示。
接下來(lái)實(shí)例化這個(gè)Animal類

var animal = new Animal();

這時(shí),js發(fā)生了以下過(guò)程:

從內(nèi)存中獲取一個(gè)空對(duì)象{}交給animal。

設(shè)置animal.__proto__為Animal.prototype

執(zhí)行構(gòu)造函數(shù)中的其他操作,比如利用this設(shè)置animal的屬性等,因?yàn)榇藭r(shí)this指向的是animal。我們這里是空函數(shù),因此沒(méi)有操作。

打印animal到控制臺(tái)。

可以看到animal只有一個(gè)__proto__屬性,并且在__proto__中還有一個(gè)__proto__屬性,這就是一條原型鏈,由__proto__組成的原型鏈。

當(dāng)在自身屬性上沒(méi)有查找到某個(gè)屬性時(shí),js就會(huì)嘗試查找__proto__上有無(wú)該屬性,不斷的向著上級(jí)__proto__爬,一直到找到那個(gè)屬性為止,或者沒(méi)有找到,返回undefined。

animal的第二級(jí)__proto__指向的就是Object。因?yàn)樗械膶?duì)象的原型鏈頂端都是Object。

在_propto_屬性中我們還能看到constructor屬性,該屬性指向一個(gè)構(gòu)造函數(shù)。他們之間的關(guān)系即是:構(gòu)造函數(shù)的prototype屬性指向了原型,而原型上的constructor又回指構(gòu)造函數(shù)Animal。

構(gòu)造函數(shù),實(shí)例,原型三者的關(guān)系如下圖

構(gòu)造函數(shù)Animal是構(gòu)成整個(gè)原型鏈的關(guān)鍵,是他利用prototype將原型傳給了后代。因此,通過(guò)操縱構(gòu)造函數(shù)的prototype,就能夠操縱原型鏈,從而對(duì)原型鏈進(jìn)行自在的拼接。

現(xiàn)在我們就開(kāi)始打造Animal->Dog->PoliceDog的原型鏈。

 Animal.prototype.breathe = function() {
    console.log("breathe~");
}
 function Dog(name){
    this.name = name;
}

 function PoliceDog(name,id) {
    Dog.call(this, name);
    this.id = id;
}
 

我們?cè)贏nimal的prototype上設(shè)置了一個(gè)breathe方法,之后又新建了Dog和PoliceDog這兩個(gè)構(gòu)造函數(shù),在構(gòu)造函數(shù)中利用call和this設(shè)置了一些自己獨(dú)有的屬性。

現(xiàn)在, Animal,Dog,PoliceDog彼此還沒(méi)有交集。當(dāng)然他們的頂級(jí)原型都是Object。

Dog.prototype = new Animal();
PoliceDog.prototype = new Dog();

上兩句代碼就將三者的原型攛在了一起。接下來(lái)還需要將原型上的constructor進(jìn)行回指。

Dog.prototype.constructor = Dog;
PoliceDog.Prototype.constructor = PoliceDog;

下面繼續(xù)為Dog和PoliceDog添加一些方法

Dog.prototype.constructor = Dog;
Dog.prototype.bark = function(){
     console.log("汪!汪!");
}
PoliceDog.prototype.manhunt = function() {
     console.log(this.name + "向犯罪份子瘋狂發(fā)動(dòng)進(jìn)攻!")
}
PoliceDog.prototype.checkId = function() {
     console.log("警犬"+this.name +"的id是:"+this.id);
}

此時(shí)我們new一個(gè)PoliceDog,并將其打印至控制臺(tái)。
可以清晰的看到這條原型鏈。

但是我們也注意到在policeDog的第二級(jí)原型上繼承了name屬性,但該屬性我們已經(jīng)在構(gòu)造函數(shù)中為自己設(shè)置了,我們不希望在原型上也繼承該屬性。

會(huì)出現(xiàn)這種情況的原因是因?yàn)槲覀冊(cè)谄唇釉蜁r(shí)用的是new出來(lái)的一個(gè)實(shí)例。Dog的實(shí)例中存在name屬性。

因此可以采用另一種拼接方法。
PoliceDog.prototype = Object.create(Dog.prototype);

Object.create函數(shù)接受一個(gè)對(duì)象A,并返回一個(gè)對(duì)象,返回的對(duì)象的__proto__為對(duì)象A。
形如這個(gè)樣子:Object.create(對(duì)象A),返回{__proto__:對(duì)象A}
關(guān)于Object.create具體的請(qǐng)移步這里。

修改之后再次打印policeDog的實(shí)例

可以看到name屬性沒(méi)有出現(xiàn)在原型里。

使用es6實(shí)現(xiàn)繼承,底層也是使用原型鏈

class Animal {
    breathe() {
        console.log("breathe")
   };
}
class Dog extends Animal {
    constructor(name){
        super();
        this.name = name;
    }
    bark(){
        console.log("汪!汪!");
    }
}
class PoliceDog extends Dog {
    constructor(name,id){
        super(name);
        this.id = id;
    }
    manhunt(){
        console.log(this.name + "向犯罪份子瘋狂發(fā)動(dòng)進(jìn)攻!");
    }
    checkId(){
        console.log("警犬"+this.name +"的id是:"+this.id);
    }
}

// 測(cè)試
let policeDog_1 = new PoliceDog("peter","k0302");
console.log(policeDog_1);

與我們使用Object.create修改原型鏈達(dá)到一樣的效果

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

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

相關(guān)文章

  • JS基礎(chǔ)-原型原型真的不能一知半解

    摘要:原型鏈和對(duì)象的原型是對(duì)象實(shí)例和它的構(gòu)造函數(shù)之間建立的鏈接,它的值是構(gòu)造函數(shù)的。對(duì)象的原型根據(jù)上文提到的構(gòu)造調(diào)用函數(shù)的時(shí)候會(huì)創(chuàng)建一個(gè)新對(duì)象,自動(dòng)將的原型指向構(gòu)造函數(shù)的對(duì)象。 showImg(https://segmentfault.com/img/remote/1460000020185197); JS的原型、原型鏈一直是比較難理解的內(nèi)容,不少初學(xué)者甚至有一定經(jīng)驗(yàn)的老鳥都不一定能完全說(shuō)清...

    changfeng1050 評(píng)論0 收藏0
  • 從實(shí)現(xiàn)角度分析js原型

    摘要:從實(shí)現(xiàn)角度分析原型鏈歡迎來(lái)我的博客閱讀從實(shí)現(xiàn)角度分析原型鏈網(wǎng)上介紹原型鏈的優(yōu)質(zhì)文章已經(jīng)有很多了,比如說(shuō)作為補(bǔ)充,就讓我們換個(gè)角度,從實(shí)現(xiàn)來(lái)分析一下吧本文假設(shè)你對(duì)原型鏈已經(jīng)有所了解。 從實(shí)現(xiàn)角度分析js原型鏈 歡迎來(lái)我的博客閱讀:《從實(shí)現(xiàn)角度分析js原型鏈》 網(wǎng)上介紹原型鏈的優(yōu)質(zhì)文章已經(jīng)有很多了,比如說(shuō): https://github.com/mqyqingfeng/Blog/issu...

    CompileYouth 評(píng)論0 收藏0
  • 理解js原型與繼承

    摘要:相當(dāng)于在用原型繼承編寫復(fù)雜代碼前理解原型繼承模型十分重要。同時(shí),還要清楚代碼中原型鏈的長(zhǎng)度,并在必要時(shí)結(jié)束原型鏈,以避免可能存在的性能問(wèn)題。 js是一門動(dòng)態(tài)語(yǔ)言,js沒(méi)有類的概念,ES6 新增了class 關(guān)鍵字,但只是語(yǔ)法糖,JavaScript 仍舊是基于原型。 至于繼承,js的繼承與java這種傳統(tǒng)的繼承不一樣.js是基于原型鏈的繼承. 在javascript里面,每個(gè)對(duì)象都有一...

    wthee 評(píng)論0 收藏0
  • js原型 原型 原型的繼承

    摘要:圖片描述缺點(diǎn)是無(wú)法實(shí)現(xiàn)多繼承可以在構(gòu)造函數(shù)中,為實(shí)例添加實(shí)例屬性。 對(duì)象的方法 Object.assign() 對(duì)象可以簡(jiǎn)寫 ,如果 key 和 value 相等則可以簡(jiǎn)寫 let name = xm; let age = 2; let obj = { name, age, fn(){ // 可以省略函數(shù)關(guān)鍵字和冒號(hào): console.log(2...

    soasme 評(píng)論0 收藏0
  • 【前端基礎(chǔ)進(jìn)階】JS原型原型、對(duì)象詳解

    摘要:二構(gòu)造函數(shù)我們先復(fù)習(xí)一下構(gòu)造函數(shù)的知識(shí)上面的例子中和都是的實(shí)例。這兩個(gè)實(shí)例都有一個(gè)構(gòu)造函數(shù)屬性,該屬性是一個(gè)指針指向。原型鏈其中是對(duì)象的實(shí)例。 一. 普通對(duì)象與函數(shù)對(duì)象 JavaScript 中,萬(wàn)物皆對(duì)象!但對(duì)象也是有區(qū)別的。分為普通對(duì)象和函數(shù)對(duì)象,Object 、Function 是 JS 自帶的函數(shù)對(duì)象。下面舉例說(shuō)明 var o1 = {}; var o2 =new Objec...

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

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

0條評(píng)論

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