今天要来看一下在JavaScript中的Inheritance(继承)概念。继承的概念在需要重复建立具备特定的属性或方法的物件时,免除物件和属性的重复宣告,Day4的内容在说明原型链的时候有提到原型继承(prototypal inheritance),是在JavaScript语法中使用到的继承方法,但今天的重点会放在NodeJS提供另外的Object继承方法与补充Class(ES6)的继承语法,以下会分别说明。
继承是指某个物件(子物件)得到另一个物件(母物件)属性的行为,子物件在继承母物件时,会使子物件含有母物件的属性,但是不会复制母物件的属性值。以中秋节的伴手礼月饼来举例,假设今天说的子物件是「月饼」,另外假设母物件是「蛋黄酥」,会有:蛋黄来源、馅料口味的属性,如果确定前面说的「月饼」是「蛋黄酥」的话,就会继承「蛋黄酥」的蛋黄来源和馅料口味的属性,而蛋黄来源和馅料口味是要依据拿到的「月饼」去定义内容的。
在Object(物件)的建立方法,除了Day4提到的建构函数(constructor)外,另外可以使用Object.create()
方法,透过一个已经定义完成的物件建立新的物件,Object.create()
方法会将定义完成的物件作为新物件的原型(prototype)以建立新物件。
NodeJS的util
Module中,所具备的inherits
函式就是以Object.create()
的方法进行继承,假定A物件为子物件、B物件为母物件,透过util.inherits(A,B)
,会以B物件的原型为参数建立一个A物件的原型,以让两个物件具备原型继承的关系。
实作看看:以EventEmitter为例
- 引入
util
与events
Module。let util = require("util"); let EventEmitter = require("events");
- 定义一个具备
firstName
、lastName
与greeting
属性且名为Person
的新物件,并继承events
。function Person(firstName, lastName){ this.firstName = firstName; this.lastName = lastName; this.greeting = "Hello, " + this.firstName +this.lastName; } util.inherits(Person, EventEmitter);
- 在
Person
物件的原型中加入greet
方法,并在方法中加入greetTime
事件的触发动作。Person.prototype.greet = function(){ console.log(this.greeting); this.emit("greetTime"); }
- 建立一个
Person
新物件、注册greetTime
事件,并呼叫greet
。let chwk = new Person("chw","k"); chwk.on("greetTime", function(){ console.log(new Date()); }); chwk.greet();
- 执行除错後,印出的成果包含原型中定义的
greet
方法所印出的字串及被其中触发功能所触发的greetTime
事件所印出的时间字串。
记得Day4有提到ES6标准所带来的语法糖-Class,在继承的概念部分也提供了简洁的语法,透过精简的extends
就可以直接加上母物件名称以继承其属性,一样以EventEmitter
为例来看与物件继承语法的差异。
实作看看:以EventEmitter为例
- 引入
events
Module。let EventEmitter = require("events");
- 定义一个具备
firstName
、lastName
、greeting
属性及greet
方法的Person
Class,以extends
继承events
。class Person extends EventEmitter{ constructor(firstName, lastName){ super(); // 在class中的constructor是方法,要使用super()提升至上层以取得this物件属性 this.firstName = firstName; this.lastName = lastName; this.greeting = "Hello, " + this.firstName + this.lastName; } greet(){ console.log(this.greeting); this.emit("greetTime"); } }
- 建立一个新的
Person
物件、注册greetTime
事件并呼叫greet
方法。let chwk = new Person("chw", "k"); chwk.on("greetTime", function(){ console.log(new Date()); }); chewk.greet();
- 执行除错後,印出的成果包含原型中定义的
greet
方法所印出的字串及被其中触发功能所触发的greetTime
事件所印出的时间字串。
继承的概念让物件得以使用其他已定义好的物件数性及方法,减少重复定义方法及物件,使物件的建立更加快速、简便。
https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Operators/super
Learn and Understand NodeJS [课程]
今天是30天程序语言研究的第十一天,研究的语言一样是python,今天主要学习的是问答程序 网址:h...
在上一篇我们学习了 Docker 的基础操作,相信大家都可以感觉到 Docker 惊人的方便性吧! ...
公家机关 资讯安全 远端连线 录影 资讯安全稽核 使用UltraVNC 反向连线 VNC 被控端 呼...
说好今天要来谈谈昨天的那段扣里,究竟写了些什麽。 为什麽可以像杰克一样神奇,产生出这样的画面呢? 我...
Reduce-Side Joins and Grouping 当 MapReuce Job 执行时,...