摘要:中有三種不同的對(duì)象,三種對(duì)象的屬性和行為和下方的類似構(gòu)造函數(shù)對(duì)象構(gòu)造函數(shù)為的類定義名稱,任何添加到這個(gè)構(gòu)造函數(shù)對(duì)象中的屬性都是類字段和類方法。
JavaScript中的Java式繼承
區(qū)別Java類似的強(qiáng)類型面向?qū)ο笳Z(yǔ)言,類為
實(shí)例字段他們是基于實(shí)例的屬性或變量,用以保存獨(dú)立對(duì)象的狀態(tài)
實(shí)例方法他們是類的所有實(shí)例所共享的方法,由每個(gè)獨(dú)立的實(shí)例調(diào)用
類字段這些屬性或者變量是屬于類的,而不是屬于類的某個(gè)實(shí)例的
類方法這些方法是屬于類的,而不是屬于類的某個(gè)實(shí)例的
js和Java的不同之處js的函數(shù)是以值的形式出現(xiàn)的,方法和字段沒(méi)有太大的區(qū)別,如果屬性值是函數(shù),那么這個(gè)屬性就定義了一個(gè)方法,否則僅僅是一個(gè)普通的屬性或者字段,用js模擬出Java的這四種類成員類型。js中有三種不同的對(duì)象,三種對(duì)象的屬性和行為和下方的類似
構(gòu)造函數(shù)對(duì)象構(gòu)造函數(shù)為js的類定義名稱,任何添加到這個(gè)構(gòu)造函數(shù)對(duì)象中的屬性都是類字段和類方法。(如果屬性值是函數(shù)的話為類方法)
參考上一篇原型對(duì)象
原型對(duì)象的屬性被類的所有實(shí)例所繼承。如果原型對(duì)象的屬性值是函數(shù),這個(gè)函數(shù)是作為類的實(shí)例方法調(diào)用
實(shí)例對(duì)象類的每個(gè)實(shí)例都為一個(gè)獨(dú)立的對(duì)象,直接給這個(gè)實(shí)例定義屬性是不會(huì)為所有實(shí)例對(duì)象所共享的,定義在實(shí)例上的非函數(shù)屬性,實(shí)際上是實(shí)例的字段
js中定義類的方法先定義一個(gè)構(gòu)造函數(shù)并設(shè)置初始化實(shí)例對(duì)象的屬性
給構(gòu)造函數(shù)的prototype對(duì)象定義實(shí)例的方法
給構(gòu)造函數(shù)定義類字段和類屬性
實(shí)現(xiàn)一個(gè)表示復(fù)數(shù)的類 先討論try和catch的錯(cuò)誤處理機(jī)制首先出現(xiàn)throw會(huì)直接暫停執(zhí)行,之前已經(jīng)說(shuō)過(guò)了
/*這是一個(gè)使用try和catch的示范程序*/ function a() { try { throw "發(fā)生錯(cuò)誤"; return "O(∩_∩)O哈哈~"; } catch(x) { throw "繼續(xù)發(fā)送錯(cuò)誤"; } }
如果程序沒(méi)有內(nèi)容會(huì)直接執(zhí)行try,但是由try必須有catch(僅僅是當(dāng)程序內(nèi)容為空的情況下),但是對(duì)于其掃尾的finally來(lái)說(shuō)則是不一定的,僅此而已
叮, 又發(fā)現(xiàn)一個(gè)框架 https://formatjs.io/ 不急慢慢來(lái)一些下方要用到的方法
Math.sqrt 平方根
exec()字符串匹配 https://developer.mozilla.org...
制定一個(gè)字符串,進(jìn)行匹配操作
parseFloat() 函數(shù)解析一個(gè)字符串參數(shù)并返回一個(gè)浮點(diǎn)數(shù)。
下面是完整的一個(gè)js的類的實(shí)現(xiàn)
/* * Complex.js * 這個(gè)文件定義了Complex類,是用來(lái)描述復(fù)數(shù) * 復(fù)數(shù)是實(shí)數(shù)和虛數(shù)的和,并且虛數(shù)i是-1的平方根 */ /* * 這個(gè)構(gòu)造函數(shù)為它創(chuàng)建的每個(gè)實(shí)例定義了字段r和i * 這兩個(gè)字段分別保存復(fù)數(shù)的實(shí)部和虛部 * 它們是對(duì)象的狀態(tài) */ function Complex(real, imaginary) { if (isNaN(real) || isNaN(imaginary)) // 確保兩個(gè)實(shí)參都是數(shù)字 throw new TypeError(); // 如果不都是數(shù)字則拋出錯(cuò)誤 this.r = real; // 復(fù)數(shù)的實(shí)部 this.i = imaginary; // 復(fù)數(shù)的虛部 }; /* * 類的實(shí)例方法定義為原型對(duì)象的函數(shù)值屬性 * 這里的定義的方法可以被所有實(shí)例進(jìn)行繼承(因?yàn)槭窃谄鋵傩陨现苯犹砑觩rototyp,而不是__proto__的,是在其子代直接進(jìn)行繼承的 * js的實(shí)例的方法必須使用this,因?yàn)槭欠椒?,不是屬性,也不是一些幫助運(yùn)行的屬性,再次重復(fù)是方法,方法是用來(lái)進(jìn)行對(duì)于對(duì)象進(jìn)行處理的 * 這里是用this來(lái)存取實(shí)例的字段的 */ // 當(dāng)前復(fù)數(shù)對(duì)象加上另外一個(gè)復(fù)數(shù),并返回一個(gè)新的計(jì)算和值后的復(fù)數(shù)對(duì)象 Complex.prototype.add = function (that) { return new Complex(this.r + that.r, this.i + that.r); }; // 當(dāng)前復(fù)數(shù)乘以另外一個(gè)復(fù)數(shù),并返回一個(gè)新的計(jì)算乘積之后的復(fù)數(shù)對(duì)象 Complex.prototype.mul = function (that) { return new Complex(this.r * that.r - this.i * that.i, this.r * that.i + this.i * that.r); }; // 計(jì)算復(fù)數(shù)的模,復(fù)數(shù)模定義為原點(diǎn)(0,0)到復(fù)平面的距離 Complex.prototype.mag = function() { return Math.sqrt(this.r * this.r + this.i * this.i); }; // 復(fù)數(shù)求負(fù)運(yùn)算 Complex.prototype.neg = function () { return new Complex(-this.r, -this.i); }; // 將復(fù)數(shù)對(duì)象轉(zhuǎn)換為一個(gè)字符串 Complex.prototype.neg = function () { return "(" + this.r + "," this.i + ")"; }; // 檢測(cè)當(dāng)前復(fù)數(shù)對(duì)象是否和另外一個(gè)復(fù)數(shù)值相等 Complex.prototype.equals = function (that) { return that != null && // 該對(duì)象必須有定義,為了防止兩個(gè)值是空值仍然相等的情況,至于為什么能分行寫(xiě),是因?yàn)闆](méi)有結(jié)束,并且用&&作為語(yǔ)句的連接,使其變?yōu)橐粋€(gè)語(yǔ)句 that.constructor == Complex && // 比較的另外一個(gè)復(fù)數(shù)必須是Complex的類,否則無(wú)法比較 this.r === that.r && this.i === that.i // 實(shí)部必須和虛部相等,一般比較使用嚴(yán)格相等比較運(yùn)算符,因?yàn)閲?yán)格相等比較運(yùn)算符比相等比較運(yùn)算符更加嚴(yán)格,也跟加安全,防止出現(xiàn)undefined或者null的問(wèn)題 }; /* 類字段(比如常量)和類方法直接定義為構(gòu)造函數(shù)的屬性(這里是用來(lái)書(shū)寫(xiě)一些構(gòu)造函數(shù)的屬性的) * 需要注意的是,類的方法通常不使用this 這是因?yàn)橐话鉰s使用類的時(shí)候是new,而new的過(guò)程是,先創(chuàng)建一個(gè)空對(duì)象,然后將對(duì)象的原型鏈進(jìn)行賦值(prototype),然后再將空對(duì)象的方法,進(jìn)行賦值,其中全是賦值,并沒(méi)有使用其對(duì)象的方法,所以一般不使用this * 并且,類僅僅是作為一個(gè)工廠生產(chǎn)相關(guān)的函數(shù),僅此而已。因?yàn)橹蛔鳛樯a(chǎn),而不進(jìn)行更改,同樣也不使用this * 這些只是對(duì)其參數(shù)進(jìn)行操作。參考上一條 */ // 這里預(yù)定了一些對(duì)復(fù)數(shù)運(yùn)算的有幫助的類字段 // 這里的類方法通常不使用關(guān)鍵字this // 他們的命名全是大寫(xiě),用來(lái)表明他們是常量,用來(lái)進(jìn)行替代某些內(nèi)容 // 在ES5中的這些類字段的屬性值為只讀 Complex.ZERO = new Complex(0, 0); // 使用這個(gè)常量創(chuàng)建一個(gè)新的對(duì)象 Complex.ONE = new Complex(1, 0); Complex.I = new Complex(0, 1); // 這個(gè)類方法將由實(shí)例對(duì)象的toString方法返回的字符串格式解析為一個(gè)Comoplex對(duì)象的parse屬性 // 即這個(gè)類方法是是將字符串進(jìn)行解析的一個(gè)類方法 // 使用try的原因是因?yàn)閖s為單線程的,即使捕獲異常,避免線程調(diào)用失敗(畢竟為單線程的嘛) 部分異常不重要,放置局部影響到全局(降低耦合性) 進(jìn)行對(duì)項(xiàng)目的分層,MVC模式,方便更加‘優(yōu)雅’的找出錯(cuò)誤(*^__^*) 嘻嘻……防止找錯(cuò)誤的時(shí)候不必要心慌,這是關(guān)鍵(⊙o⊙) // 或者拋出一個(gè)類型錯(cuò)誤異常 // 因?yàn)檫@里是另外的處理,和其余不同,所以命名使用_開(kāi)頭,方便進(jìn)行查找 Complex.parse = function(s) { try { // 假設(shè)解析成功 var m = Complex._format.exec(s); // 利用正則表達(dá)式進(jìn)行匹配 return new Complex(parseFloat(m[1]), parseFloat(m[1])); } catch(x) { // 如果解析失敗則拋出異常 throw new TypeError("can"t parse ""+ s""as a complex number."); } }; // 定義類的私有字段,這個(gè)字段在Complex.parse()中用到了 // 依舊,命名,下劃線前綴表明是類的內(nèi)部使用的,不屬于類的公有api部分,因?yàn)楣衋pi部分要使用prototype進(jìn)行繼承 Complex._format = /^{([^,]+), ([^}]+)}&/; // (^o^)/完成啦~(≧▽≦)/~啦啦啦
文件地址https://github.com/meloveming...
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/96258.html
摘要:是完全的面向?qū)ο笳Z(yǔ)言,它們通過(guò)類的形式組織函數(shù)和變量,使之不能脫離對(duì)象存在。而在基于原型的面向?qū)ο蠓绞街校瑢?duì)象則是依靠構(gòu)造器利用原型構(gòu)造出來(lái)的。 JavaScript 函數(shù)式腳本語(yǔ)言特性以及其看似隨意的編寫(xiě)風(fēng)格,導(dǎo)致長(zhǎng)期以來(lái)人們對(duì)這一門語(yǔ)言的誤解,即認(rèn)為 JavaScript 不是一門面向?qū)ο蟮恼Z(yǔ)言,或者只是部分具備一些面向?qū)ο蟮奶卣?。本文將回歸面向?qū)ο蟊疽?,從?duì)語(yǔ)言感悟的角度闡述為什...
摘要:可以通過(guò)構(gòu)造函數(shù)和原型的方式模擬實(shí)現(xiàn)類的功能。原型式繼承與類式繼承類式繼承是在子類型構(gòu)造函數(shù)的內(nèi)部調(diào)用超類型的構(gòu)造函數(shù)。寄生式繼承這種繼承方式是把原型式工廠模式結(jié)合起來(lái),目的是為了封裝創(chuàng)建的過(guò)程。 js繼承的概念 js里常用的如下兩種繼承方式: 原型鏈繼承(對(duì)象間的繼承) 類式繼承(構(gòu)造函數(shù)間的繼承) 由于js不像java那樣是真正面向?qū)ο蟮恼Z(yǔ)言,js是基于對(duì)象的,它沒(méi)有類的概念。...
摘要:會(huì)造成內(nèi)存浪費(fèi)的問(wèn)題構(gòu)造函數(shù)繼承聲明父類聲明子類生成實(shí)例組合式繼承組合式繼承是汲取了兩者的優(yōu)點(diǎn),既避免了內(nèi)存浪費(fèi),又使得每個(gè)實(shí)例化的子類互不影響。 寫(xiě)在前面 既然是淺談,就不會(huì)從原理上深度分析,只是幫助我們更好地理解... 面向?qū)ο笈c面向過(guò)程 面向?qū)ο蠛兔嫦蜻^(guò)程是兩種不同的編程思想,剛開(kāi)始接觸編程的時(shí)候,我們大都是從面向過(guò)程起步的,畢竟像我一樣,大家接觸的第一門計(jì)算機(jī)語(yǔ)言大概率都是C語(yǔ)...
摘要:對(duì)象重新認(rèn)識(shí)面向?qū)ο竺嫦驅(qū)ο髲脑O(shè)計(jì)模式上看,對(duì)象是計(jì)算機(jī)抽象現(xiàn)實(shí)世界的一種方式。除了字面式聲明方式之外,允許通過(guò)構(gòu)造器創(chuàng)建對(duì)象。每個(gè)構(gòu)造器實(shí)際上是一個(gè)函數(shù)對(duì)象該函數(shù)對(duì)象含有一個(gè)屬性用于實(shí)現(xiàn)基于原型的繼承和共享屬性。 title: JS對(duì)象(1)重新認(rèn)識(shí)面向?qū)ο? date: 2016-10-05 tags: JavaScript 0x00 面向?qū)ο?從設(shè)計(jì)模式上看,對(duì)象是...
摘要:很多情況下,通常一個(gè)人類,即創(chuàng)建了一個(gè)具體的對(duì)象。對(duì)象就是數(shù)據(jù),對(duì)象本身不包含方法。類是相似對(duì)象的描述,稱為類的定義,是該類對(duì)象的藍(lán)圖或原型。在中,對(duì)象通過(guò)對(duì)類的實(shí)體化形成的對(duì)象。一類的對(duì)象抽取出來(lái)。注意中,對(duì)象一定是通過(guò)類的實(shí)例化來(lái)的。 showImg(https://segmentfault.com/img/bVTJ3H?w=900&h=385); 馬上就要到七夕了,離年底老媽老爸...
閱讀 1880·2019-08-29 16:44
閱讀 2184·2019-08-29 16:30
閱讀 791·2019-08-29 15:12
閱讀 3536·2019-08-26 10:48
閱讀 2669·2019-08-23 18:33
閱讀 3790·2019-08-23 17:01
閱讀 1950·2019-08-23 15:54
閱讀 1313·2019-08-23 15:05