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