摘要:我們知道創(chuàng)建了一個(gè)函數(shù)就帶了一個(gè)屬性,創(chuàng)建一個(gè)實(shí)例就帶著一個(gè)指針,這個(gè)指針是實(shí)例和構(gòu)造函數(shù)的原型對(duì)象間的聯(lián)系,這個(gè)指針在腳本中是不可見(jiàn)的,也就是你不能訪(fǎng)問(wèn)的,但是在和中,提供了來(lái)支持訪(fǎng)問(wèn),這么一說(shuō),相信大家應(yīng)該能明白吧
前言
一般我們看到prototype就會(huì)下意識(shí)的說(shuō)這不就是原型對(duì)象嘛?但是你們真的了解prototype嘛?就當(dāng)你們很了解了,畢竟是基礎(chǔ)知識(shí),我就簡(jiǎn)單說(shuō)說(shuō)
正文先說(shuō)說(shuō)工廠(chǎng)模式的由來(lái)吧,創(chuàng)建對(duì)象我們通常可以用new Object()或者直接對(duì)象字面量{}創(chuàng)建,但是要是對(duì)象之間又有其他共用的代碼塊又將如何呢?不錯(cuò),這會(huì)造成大量的代碼冗余,因?yàn)樵贘S的世界里沒(méi)有接口的概念(ES5之前),我們平時(shí)在JS所說(shuō)的類(lèi)也并非實(shí)際意義上的類(lèi),很多類(lèi)的特性JS都沒(méi)有,我一般就把JS的類(lèi)稱(chēng)為一個(gè)"另類(lèi)",雖然ES6有了所謂的接口,但是萬(wàn)變不離其宗。扯得有點(diǎn)遠(yuǎn)啊,既然普通創(chuàng)建對(duì)象會(huì)造成冗余,那怎么避免呢?起初用的是工廠(chǎng)模式,如demo1所示:
demo1function demo1 () { this.name = "mirok", this.show = show } function demo2 () { this.name = "july", this.show = show } function show () { console.log(this.name) } var name = "global" new demo1().show() //mirok new demo2().show() // july show() //global
雖然demo1解決了問(wèn)題,但是這樣寫(xiě)沒(méi)有任何封裝而言, show函數(shù)并不是引用類(lèi)型特定能訪(fǎng)問(wèn)的,如demo1輸出了global一樣,為了解決此類(lèi)問(wèn)題,便有了原型模式,也就是你們經(jīng)常用的prototype
demo2function Demo2 () { } Demo2.prototype.show = function() { console.log(this.name) } var obj1 = new Demo2() var obj2 = new Demo2() obj1.name = "mirok" obj2.name = "july" obj1.show() //mirok obj2.show() // july
網(wǎng)上有很多解釋了__proto__和prototype的區(qū)別,還各自寫(xiě)了例子,雖然說(shuō)了很多,也是解釋得不清不楚。我們知道創(chuàng)建了一個(gè)函數(shù)就帶了一個(gè)prototype屬性,創(chuàng)建一個(gè)實(shí)例就帶著一個(gè)[[prototype]]指針,這個(gè)指針是實(shí)例和構(gòu)造函數(shù)的原型對(duì)象間的聯(lián)系,這個(gè)指針在腳本中是不可見(jiàn)的,也就是你不能訪(fǎng)問(wèn)的,但是在Firefox、Safari 和 Chrome中,提供了__proto__來(lái)支持訪(fǎng)問(wèn),這么一說(shuō),相信大家應(yīng)該能明白吧
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96599.html
摘要:這又是什么呢這個(gè)相對(duì)之前的比較復(fù)雜,但是高效的一點(diǎn)是只調(diào)用一次被繼承者構(gòu)造函數(shù)原理就是通過(guò)寄生方式創(chuàng)建一個(gè)被繼承者的副本,副本和被繼承者共用一個(gè)這樣就解決了之前的問(wèn)題返回的一個(gè)副本設(shè)置指向因?yàn)樾赂北镜脑蛯?duì)象被重寫(xiě)副本作為的原型對(duì)象 前言 我們學(xué)JAVA的時(shí)候說(shuō)到繼承就是一個(gè)extends ClassName的事情,但是在JS的世界里繼承和我們?cè)贘AVA所認(rèn)識(shí)的繼承實(shí)現(xiàn)方法又有一些不同...
摘要:為啥我要自己實(shí)現(xiàn)一個(gè)語(yǔ)法糖為什么要自己實(shí)現(xiàn)一個(gè)語(yǔ)法糖呢因?yàn)橹皩?duì)于里的語(yǔ)法糖一直是理論理解但是并親自嘗試實(shí)現(xiàn)過(guò)。直到有一天在頭條的面試中我聊了摸著自己的良心說(shuō)我可以實(shí)現(xiàn)一個(gè)語(yǔ)法糖面試官嗯那你實(shí)現(xiàn)一個(gè)吧。我們知道構(gòu)造函數(shù)一般是不寫(xiě)的。 為啥我要自己實(shí)現(xiàn)一個(gè)new語(yǔ)法糖? 為什么要自己實(shí)現(xiàn)一個(gè)new語(yǔ)法糖呢? 因?yàn)橹皩?duì)于JS里的new語(yǔ)法糖一直是理論理解,但是并親自嘗試實(shí)現(xiàn)過(guò)。 直到有一...
摘要:首先定義空函數(shù)這個(gè)不用解釋?zhuān)缓蟀堰@個(gè)空函數(shù)的原型指向?yàn)榈脑?,然后再把的原型指向這個(gè)新的對(duì)象,一個(gè)完美傳遞最后,在把原型的構(gòu)造方法定義成華麗的轉(zhuǎn)身,結(jié)果如下結(jié)果還是不對(duì),于是我又在大神的肩膀上墊了一下腳。 總是聽(tīng)說(shuō)面向?qū)ο?,?lèi),繼承,__proto__,prototype,constructor.......于是乎小整理一下。 首先說(shuō),JS里的繼承是怎么弄的呢? 首先創(chuàng)建類(lèi)(Pers...
摘要:前言文章主要基于高級(jí)程序設(shè)計(jì)總結(jié)的基本重寫(xiě)了全文補(bǔ)充知識(shí)點(diǎn)新增實(shí)例優(yōu)化排版新增檢測(cè)方法技巧用法構(gòu)造函數(shù)創(chuàng)建一個(gè)用護(hù)定義的對(duì)象類(lèi)型的實(shí)例或具有構(gòu)造函數(shù)的內(nèi)置對(duì)象類(lèi)型之一命令執(zhí)行構(gòu)造函數(shù)返回一個(gè)實(shí)例對(duì)象構(gòu)造函數(shù)一個(gè)指定對(duì)象實(shí)例的類(lèi)型的函數(shù)傳慘一 前言 文章主要基于>總結(jié)的!!!PS: 2018/05/09 基本重寫(xiě)了全文,補(bǔ)充知識(shí)點(diǎn),新增實(shí)例,優(yōu)化排版PS: 2018/05/11 新增檢測(cè)...
摘要:標(biāo)準(zhǔn)對(duì)象,語(yǔ)義由本規(guī)范定義的對(duì)象。這意味著雖然有,本質(zhì)上依然是構(gòu)造函數(shù),并不能像那樣表演多繼承嵌套類(lèi)等高難度動(dòng)作。不過(guò)這里的并不是我們所說(shuō)的數(shù)據(jù)類(lèi)型,而是對(duì)象構(gòu)造函數(shù)。 序 ECMAScript is an object-oriented programming language for performing computations and manipulating computat...
閱讀 3724·2021-10-12 10:11
閱讀 1992·2019-08-30 15:53
閱讀 1599·2019-08-30 13:15
閱讀 2312·2019-08-30 11:25
閱讀 1809·2019-08-29 11:24
閱讀 1657·2019-08-26 13:53
閱讀 3530·2019-08-26 13:22
閱讀 1773·2019-08-26 10:24