成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

js中的Java式繼承

SillyMonkey / 2629人閱讀

摘要:中有三種不同的對(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

相關(guān)文章

  • 面向?qū)ο蟮?JavaScript

    摘要:是完全的面向?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ǔ)言感悟的角度闡述為什...

    novo 評(píng)論0 收藏0
  • JavaScript繼承詳解

    摘要:可以通過(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)有類的概念。...

    Yangyang 評(píng)論0 收藏0
  • 淺談JavaScript的面向?qū)ο蠛退姆庋b、繼承、多態(tà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ǔ)...

    MAX_zuo 評(píng)論0 收藏0
  • JS對(duì)象(1)重新認(rèn)識(shí)面向?qū)ο?/b>

    摘要:對(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ì)象是...

    superw 評(píng)論0 收藏0
  • SegmentFault 技術(shù)周刊 Vol.32 - 七夕將至,你的“對(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); 馬上就要到七夕了,離年底老媽老爸...

    李昌杰 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<