js 繼承

Object.create()實(shí)現(xiàn)經(jīng)典繼承

const person = {
  isHuman: false,
  printIntroduction: function () {
    console.log(`My name is ${this.name}. Am I human? ${this.isHuman}`);
  }
};

const me = Object.create(person);

me.name = "Matthew"; // "name" is a property set on "me", but not on "person"
me.isHuman = true; // inherited properties can be overwritten

me.printIntroduction();
// expected output: "My name is Matthew. Am I human? true"

Object.prototype.toString.call(me) // "[object Object]"

me和person都是Object對象拷沸,me繼承了person的所有屬性。

看看Object.create()的Polyfill

if (typeof Object.create !== "function") {
    Object.create = function (proto, propertiesObject) {
        if (typeof proto !== 'object' && typeof proto !== 'function') {
            throw new TypeError('Object prototype may only be an Object: ' + proto);
        } else if (proto === null) {
            throw new Error("This browser's implementation of Object.create is a shim and doesn't support 'null' as the first argument.");
        }

        if (typeof propertiesObject != 'undefined') {
            throw new Error("This browser's implementation of Object.create is a shim and doesn't support a second argument.");
        }

        function F() {}
        F.prototype = proto;

        return new F();
    };
}

Object.create()返回一個新的對象,這個對象的prototype指向proto

ES5

function Person(name) {
  this.name = name
}

Person.prototype.sayHello = function() {
  console.log(this.name + ' say: hello')
}

function Teacher(subject) {
  Person.call(this)
  this.subject = this.subject
}

console.log(Teacher.prototype.constructor) // [Function: Teacher]
console.log(Teacher.prototype instanceof Person) // false

Teacher.prototype = Object.create(Person.prototype)

console.log(Teacher.prototype instanceof Person) // true
console.log(Teacher.prototype.constructor) // [Function: Person]

Teacher.prototype.constructor = Teacher 

將父類原型指向子類

function inheritPrototype(subType, superType){
  var prototype = Object.create(superType.prototype); // 創(chuàng)建對象再层,創(chuàng)建父類原型的一個副本
  prototype.constructor = subType;                    // 增強(qiáng)對象,彌補(bǔ)因重寫原型而失去的默認(rèn)的constructor 屬性
  subType.prototype = prototype;                      // 指定對象堡纬,將新創(chuàng)建的對象賦值給子類的原型
}

ES6類繼承extends

extends關(guān)鍵字主要用于類聲明或者類表達(dá)式中聂受,以創(chuàng)建一個類,該類是另一個類的子類烤镐。其中constructor表示構(gòu)造函數(shù)蛋济,一個類中只能有一個構(gòu)造函數(shù),有多個會報(bào)出SyntaxError錯誤,如果沒有顯式指定構(gòu)造方法职车,則會添加默認(rèn)的 constructor方法瘫俊,使用例子如下。

class Rectangle {
    // constructor
    constructor(height, width) {
        this.height = height;
        this.width = width;
    }
    
    // Getter
    get area() {
        return this.calcArea()
    }
    
    // Method
    calcArea() {
        return this.height * this.width;
    }
}

const rectangle = new Rectangle(10, 20);
console.log(rectangle.area);
// 輸出 200

-----------------------------------------------------------------
// 繼承
class Square extends Rectangle {

  constructor(length) {
    super(length, length);
    
    // 如果子類中存在構(gòu)造函數(shù)悴灵,則需要在使用“this”之前首先調(diào)用 super()扛芽。
    this.name = 'Square';
  }

  get area() {
    return this.height * this.width;
  }
}

const square = new Square(10);
console.log(square.area);
// 輸出 100

extends繼承的核心代碼如下,其實(shí)現(xiàn)和上述的inheritPrototype方式一樣

function _inherits(subType, superType) {
  
    // 創(chuàng)建對象积瞒,創(chuàng)建父類原型的一個副本
    // 增強(qiáng)對象川尖,彌補(bǔ)因重寫原型而失去的默認(rèn)的constructor 屬性
    // 指定對象,將新創(chuàng)建的對象賦值給子類的原型
    subType.prototype = Object.create(superType && superType.prototype, {
        constructor: {
            value: subType,
            enumerable: false,
            writable: true,
            configurable: true
        }
    });
    
    if (superType) {
        Object.setPrototypeOf 
            ? Object.setPrototypeOf(subType, superType) 
            : subType.__proto__ = superType;
    }
}

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末茫孔,一起剝皮案震驚了整個濱河市叮喳,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌缰贝,老刑警劉巖馍悟,帶你破解...
    沈念sama閱讀 211,265評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異剩晴,居然都是意外死亡锣咒,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,078評論 2 385
  • 文/潘曉璐 我一進(jìn)店門赞弥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來毅整,“玉大人,你說我怎么就攤上這事绽左〉考担” “怎么了?”我有些...
    開封第一講書人閱讀 156,852評論 0 347
  • 文/不壞的土叔 我叫張陵拼窥,是天一觀的道長戏蔑。 經(jīng)常有香客問我蹋凝,道長,這世上最難降的妖魔是什么辛臊? 我笑而不...
    開封第一講書人閱讀 56,408評論 1 283
  • 正文 為了忘掉前任仙粱,我火速辦了婚禮,結(jié)果婚禮上彻舰,老公的妹妹穿的比我還像新娘伐割。我一直安慰自己,他們只是感情好刃唤,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,445評論 5 384
  • 文/花漫 我一把揭開白布隔心。 她就那樣靜靜地躺著,像睡著了一般尚胞。 火紅的嫁衣襯著肌膚如雪硬霍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,772評論 1 290
  • 那天笼裳,我揣著相機(jī)與錄音唯卖,去河邊找鬼。 笑死躬柬,一個胖子當(dāng)著我的面吹牛拜轨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播允青,決...
    沈念sama閱讀 38,921評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼橄碾,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了颠锉?” 一聲冷哼從身側(cè)響起法牲,我...
    開封第一講書人閱讀 37,688評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎琼掠,沒想到半個月后拒垃,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,130評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瓷蛙,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,467評論 2 325
  • 正文 我和宋清朗相戀三年恶复,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片速挑。...
    茶點(diǎn)故事閱讀 38,617評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖副硅,靈堂內(nèi)的尸體忽然破棺而出姥宝,到底是詐尸還是另有隱情,我是刑警寧澤恐疲,帶...
    沈念sama閱讀 34,276評論 4 329
  • 正文 年R本政府宣布腊满,位于F島的核電站套么,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碳蛋。R本人自食惡果不足惜胚泌,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,882評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望肃弟。 院中可真熱鬧玷室,春花似錦、人聲如沸笤受。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,740評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽箩兽。三九已至津肛,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間般甲,已是汗流浹背告唆。 一陣腳步聲響...
    開封第一講書人閱讀 31,967評論 1 265
  • 我被黑心中介騙來泰國打工琉用, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人部蛇。 一個月前我還...
    沈念sama閱讀 46,315評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像妥色,于是被迫代替她去往敵國和親搪花。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,486評論 2 348

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

  • 繼承6種套餐 參照紅皮書嘹害,JS繼承一共6種 1.原型鏈繼承 核心思想:子類的原型指向父類的一個實(shí)例 Son.pro...
    燈不梨喵閱讀 3,128評論 1 2
  • 問題1: apply撮竿、call 、bind有什么作用笔呀,什么區(qū)別 apply/call/bind 問題2: 以下代碼...
    DCbryant閱讀 290評論 0 0
  • 用過 React的讀者知道幢踏,經(jīng)常用 extends繼承 React.Component: React github...
    grain先森閱讀 8,480評論 3 41
  • 經(jīng)典的繼承法有何問題 看一下報(bào)錯信息 按照原型鏈回溯規(guī)則,Date的所有原型方法都可以通過MyDate對象的原型鏈...
    Perity閱讀 1,491評論 0 50
  • 一许师、原型鏈 學(xué)過java的同學(xué)應(yīng)該都知道房蝉,繼承是java的重要特點(diǎn)之一,許多面向?qū)ο蟮恼Z言都支持兩種繼承方式:接口...
    grain先森閱讀 1,418評論 0 39