JavaScript中的類與繼承

一玄括、ECMAScript 5標準中的類

1卒茬、定義原型類
/* 定義Calcula類 */
var Calcula = function (x, y) {
    this.x = x;
    this.y = y;
}
/* 此處使用了Object.defineProperties方法給Calcula.prototype添加方法,是
 * 為了保證類與ES6-Class編譯后的類保持相同的特性酥筝,非必需不使用也可以
 */
Object.defineProperties(Calcula.prototype,  {
    add: {
        configurable: false,
        enumerable: false,
        value: function () {
            return this.x + this.y;
        },
        writable: false
    },
    sub: {
        configurable: false,
        enumerable: false,
        value: function () {
            let x = this.x;
            let y = this.y;
            if (x > y) {
                return x - y;
            } else if (x < y) {
                return y - x;
            } else {
                return 0;
            }
        },
        writable: false
    }
});
const calcula = new Calcula(100, 900);
console.log(calcula.sub());

2滚躯、原型類繼承

下面是一典型的關于原型繼承的代碼。

/* 創(chuàng)建Foo原型類的Constructor函數(shù) */
var Foo = function (name) {
    this.name = name;
}

/* 為Foo原型類添加prototype方法*/
Foo.prototype = {
    myName: function () {
        console.log(this.name);
        return this.name;
    };
};

/* 創(chuàng)建Bar原型類的Constructor函數(shù)嘿歌,并將this指針綁定到Foo類掸掏,使得Bar類的實例可以訪問Foo類的屬性和方法*/
var Bar = function (name, label) {
    Foo.call(this, name);
    this.label = label;
}

/* 創(chuàng)建Bar類并使用Foo.prototype對象作為新創(chuàng)建的Bar類的prototype對象 */
Bar.prototype = Object.create(Foo.prototype);

/* 為Bar類添加方法*/
Bar.prototype = {
    myLabel: function () {
        console.log(this.label);
        return this.label;
    };
};

const a = new Bar("編程語言JavaScript", "它是一門弱類型語言");
a.myName();
a.myLabel();

3、靜態(tài)類

調(diào)用該類的靜態(tài)方法不需要類的實例宙帝,該類的實例無法調(diào)用該類的任一靜態(tài)方法丧凤,這也意味著類的靜態(tài)方法內(nèi)部的this指針是指向類本身的,而不是指向其實例步脓。靜態(tài)方法通常用于為一個應用程序創(chuàng)建工具函數(shù)愿待。

var Point = function (x, y) {
    this.x = x;
    this.y = y;
};

Point.distance = function (a, b) {
    const x = a - b;
    const y = a + b;
    return Math.hypot(x, y);
};

console.log(p1.distance(10, 10));   // 因?qū)嵗裏o法調(diào)用靜態(tài)方法浩螺,所以瀏覽器會報錯
console.log(Point.distance(p1, p2));

4、原型類擴展-繼承常規(guī)對象

如果原型類要繼承一個常規(guī)對象仍侥,則可以將對象設置為原型類的protoype對象要出。

/* 實例1:類繼承常規(guī)對象(JSON)*/
var Animal = {
    hobby: ["籃球", "編程"],
    speak() {
        console.log(this.name + ' can speak English!');
        console.log(this.hobby);
    }
};
var Person = function (name) {
    this.name = name;
};
Person.prototype = Animal;
var p = new Person("小明");
p.speak();

二、ECMAScript 6標準中的類

1农渊、類

/* 定義Greeter類患蹂,并添加Constructor構(gòu)造器和greet方法  */
class Greeter {
    constructor(message) {
        this.greeting = message;
    }
    greet() {
        return "你好," + this.greeting;
    }
}
let greeter = new Greeter("world");
console.log(greeter.greet());

?????? 聲明了一個Greeter的類腿时,它有3個成員:類的屬性(greeting)况脆、類的構(gòu)造器(Constructor)、類的方法(greet)批糟。

?????? 當我們使用new關鍵字實例化Class的時候格了,首先會執(zhí)行自己的構(gòu)造器中的方法。

2徽鼎、類繼承

?????? extends關鍵字在類聲明或類表達式中用于創(chuàng)建一個繼承于另一個類的子類盛末。

class Animal { 
    constructor(name) {
        this.name = name;
    }
    eat() {
        console.log(this.name + '會汪汪叫');
    }
}

class Dog extends Animal {
    constructor() {
        super();
    }
}

var d = new Dog('狗A'); 
d.eat();

?????? 如果子類中存在構(gòu)造函數(shù),則需要在使用“this”之前首先調(diào)用super()否淤。

3悄但、靜態(tài)類

?????? static關鍵字用來定義一個類的一個靜態(tài)方法,調(diào)用該類的靜態(tài)方法不需要類的實例石抡,該類的實例無法調(diào)用該類的任一靜態(tài)方法檐嚣,這也意味著類的靜態(tài)方法內(nèi)部的this指針是指向類本身的,而不是指向其實例啰扛。靜態(tài)方法通常用于為一個應用程序創(chuàng)建工具函數(shù)嚎京。

class Point {
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }

    static distance(a, b) {
        const dx = a.x - b.x;
        const dy = a.y - b.y;

        return Math.hypot(dx, dy);
    }
}

const p1 = new Point(5, 5);
const p2 = new Point(10, 10);

console.log(p1.distance(10, 10));   // 因?qū)嵗裏o法調(diào)用靜態(tài)方法,所以瀏覽器會報錯
console.log(Point.distance(p1, p2));

4隐解、類擴展-類繼承常規(guī)對象

?????? 請注意鞍帝,類不能擴展常規(guī)(不可構(gòu)造/非構(gòu)造的)對象。如果要繼承常規(guī)對象煞茫,可以改用Object.setPrototypeOf():

/* 實例1:類繼承常規(guī)對象(JSON)*/
const Animal = {
    hobby: ["籃球", "編程"],
    speak() {
        console.log(this.name + ' can speak English!');
        console.log(this.hobby);
    }
};
class Person {
    constructor(name) {
        this.name = name;
    }
}
// 以Animal對象作為Person類的原型對象
Object.setPrototypeOf(Person.prototype, Animal);
const d = new Person("小明");
d.speak();
/* 實例2:類繼承常規(guī)對象(Array)*/
const methods = [
    "正弦",
    "余弦",
    {
        name: "小明",
        hobby: [
            "編程", "LOL"
        ]
    }
];
class Methods {
    constructor(name) {
        this.name = name;
    }
}
Object.setPrototypeOf(Methods.prototype, methods);
const methodsItem = new Methods("小明");
console.log(methodsItem[2]);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
禁止轉(zhuǎn)載帕涌,如需轉(zhuǎn)載請通過簡信或評論聯(lián)系作者。
  • 序言:七十年代末续徽,一起剝皮案震驚了整個濱河市蚓曼,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌炸宵,老刑警劉巖辟躏,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異土全,居然都是意外死亡捎琐,警方通過查閱死者的電腦和手機会涎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瑞凑,“玉大人末秃,你說我怎么就攤上這事∽延” “怎么了练慕?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長技掏。 經(jīng)常有香客問我铃将,道長,這世上最難降的妖魔是什么哑梳? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任劲阎,我火速辦了婚禮,結(jié)果婚禮上鸠真,老公的妹妹穿的比我還像新娘悯仙。我一直安慰自己,他們只是感情好吠卷,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布锡垄。 她就那樣靜靜地躺著,像睡著了一般祭隔。 火紅的嫁衣襯著肌膚如雪货岭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天疾渴,我揣著相機與錄音茴她,去河邊找鬼。 笑死程奠,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的祭钉。 我是一名探鬼主播瞄沙,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼慌核!你這毒婦竟也來了距境?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤垮卓,失蹤者是張志新(化名)和其女友劉穎垫桂,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體粟按,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡诬滩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年霹粥,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片疼鸟。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡后控,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出空镜,到底是詐尸還是另有隱情浩淘,我是刑警寧澤,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布吴攒,位于F島的核電站张抄,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏洼怔。R本人自食惡果不足惜署惯,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茴厉。 院中可真熱鬧泽台,春花似錦、人聲如沸矾缓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽嗜闻。三九已至蜕依,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間琉雳,已是汗流浹背样眠。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留翠肘,地道東北人檐束。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像束倍,于是被迫代替她去往敵國和親被丧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,262評論 25 707
  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line)绪妹,也就是一...
    悟名先生閱讀 4,151評論 0 13
  • The rule is simple: if a property or a method is not foun...
    __Liu__閱讀 111評論 0 0
  • 人生應該是一個輪回甥桂。我感覺很多事情都是重走一遭。我認識某位女顧客很久了邮旷,總是保持若即若離的關系黄选,像日光下的影子,有...
    2668e9ad2f35閱讀 669評論 1 0
  • 秋風真的不易婶肩, 它為了消除塑料垃圾办陷, 忽而將其高高拋起貌夕, 忽而又狠摔在地, 或者將其卷入水里懂诗,墻角蜂嗽,石頭的縫隙, ...
    緣wxh閱讀 339評論 11 21