原型與原型鏈

1、構(gòu)造函數(shù)

構(gòu)造函數(shù)模式的目的就是為了創(chuàng)建一個(gè)自定義類,并且創(chuàng)建這個(gè)類的實(shí)例。構(gòu)造函數(shù)模式中擁有了類和實(shí)例的概念,并且實(shí)例和實(shí)例之間是相互獨(dú)立的,即實(shí)例識(shí)別。
  • 構(gòu)造函數(shù)就是一個(gè)普通的函數(shù),創(chuàng)建方式和普通函數(shù)沒有區(qū)別,不同的是構(gòu)造函數(shù)習(xí)慣上首字母大寫。另外就是調(diào)用方式的不同,普通函數(shù)是直接調(diào)用,而構(gòu)造函數(shù)需要使用new關(guān)鍵字來調(diào)用。
        this.name = name
        this.age = age
        this.gender = gender
        this.sayName = function () {
            alert(this.name);
        }
    }
    var per = new Person("張三", 18, "男");
    function Dog(name, age, gender) {
        this.name = name
        this.age = age
        this.gender = gender
    }
    var dog = new Dog("李四", 24, "公")
    console.log(per);//當(dāng)我們直接在頁面中打印一個(gè)對(duì)象時(shí),事件上是輸出的對(duì)象的toString()方法的返回值
    console.log(dog);
輸出
  • 每創(chuàng)建一個(gè)Person構(gòu)造函數(shù),在Person構(gòu)造函數(shù)中,為每一個(gè)對(duì)象都添加了一個(gè)sayName方法,也就是說構(gòu)造函數(shù)每執(zhí)行一次就會(huì)創(chuàng)建一個(gè)新的sayName方法。這樣就導(dǎo)致了構(gòu)造函數(shù)執(zhí)行一次就會(huì)創(chuàng)建一個(gè)新的方法,執(zhí)行10000次就會(huì)創(chuàng)建10000個(gè)新的方法,而10000個(gè)方法都是一摸一樣的,為什么不把這個(gè)方法單獨(dú)放到一個(gè)地方,并讓所有的實(shí)例都可以訪問到呢?這就需要原型(prototype)

2、原型對(duì)象

  • 在 JavaScript 中,每當(dāng)定義一個(gè)對(duì)象(函數(shù)也是對(duì)象)時(shí)候,對(duì)象中都會(huì)包含一些預(yù)定義的屬性。其中每個(gè)函數(shù)對(duì)象都有一個(gè)prototype 屬性,這個(gè)屬性指向函數(shù)的原型對(duì)象。


    img
  • 原型對(duì)象就相當(dāng)于一個(gè)公共的區(qū)域,所有同一個(gè)類的實(shí)例都可以訪問到這個(gè)原型對(duì)象,我們可以將對(duì)象中共有的內(nèi)容,統(tǒng)一設(shè)置到原型對(duì)象中。

2、原型鏈

在JavaScript中萬物都是對(duì)象,對(duì)象和對(duì)象之間也有關(guān)系,并不是孤立存在的。對(duì)象之間的繼承關(guān)系,在JavaScript中是通過prototype對(duì)象指向父類對(duì)象,直到指向Object對(duì)象為止,這樣就形成了一個(gè)原型指向的鏈條,專業(yè)術(shù)語稱之為原型鏈。

  • 當(dāng)我們?cè)L問對(duì)象的一個(gè)屬性或方法時(shí),它會(huì)先在對(duì)象自身中尋找,如果有則直接使用,如果沒有則會(huì)去原型對(duì)象中尋找,如果找到則直接使用。如果沒有則去原型的原型中尋找,直到找到Object對(duì)象的原型,Object對(duì)象的原型沒有原型,如果在Object原型中依然沒有找到,則返回undefined。
  • 當(dāng)讀取實(shí)例的屬性時(shí),如果找不到,就會(huì)查找與對(duì)象關(guān)聯(lián)的原型中的屬性,如果還查不到,就去找原型的原型,一直找到最頂層Object為止。Object是JS中所有對(duì)象數(shù)據(jù)類型的基類(最頂層的類)在Object.prototype上沒有proto這個(gè)屬性。

    console.log(Object.prototype.proto === null) // true

    原型鏈

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容