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