Day6 JS-Object与Inheritance

今天要来看一下在JavaScript中的Inheritance(继承)概念。继承的概念在需要重复建立具备特定的属性或方法的物件时,免除物件和属性的重复宣告,Day4的内容在说明原型链的时候有提到原型继承(prototypal inheritance),是在JavaScript语法中使用到的继承方法,但今天的重点会放在NodeJS提供另外的Object继承方法与补充Class(ES6)的继承语法,以下会分别说明。

Inheritance 继承

继承是指某个物件(子物件)得到另一个物件(母物件)属性的行为,子物件在继承母物件时,会使子物件含有母物件的属性,但是不会复制母物件的属性值。以中秋节的伴手礼月饼来举例,假设今天说的子物件是「月饼」,另外假设母物件是「蛋黄酥」,会有:蛋黄来源、馅料口味的属性,如果确定前面说的「月饼」是「蛋黄酥」的话,就会继承「蛋黄酥」的蛋黄来源和馅料口味的属性,而蛋黄来源和馅料口味是要依据拿到的「月饼」去定义内容的。

https://ithelp.ithome.com.tw/upload/images/20210921/20139980ux4qnDFzNG.jpg

Object的继承(NodeJS)

在Object(物件)的建立方法,除了Day4提到的建构函数(constructor)外,另外可以使用Object.create()方法,透过一个已经定义完成的物件建立新的物件,Object.create()方法会将定义完成的物件作为新物件的原型(prototype)以建立新物件。

https://ithelp.ithome.com.tw/upload/images/20210921/20139980tdsjb9BbdX.jpg

NodeJS的utilModule中,所具备的inherits函式就是以Object.create()的方法进行继承,假定A物件为子物件、B物件为母物件,透过util.inherits(A,B),会以B物件的原型为参数建立一个A物件的原型,以让两个物件具备原型继承的关系。

https://ithelp.ithome.com.tw/upload/images/20210921/20139980fjmMeJWZvn.jpg

实作看看:以EventEmitter为例

  1. 引入utileventsModule。
let util = require("util");
let EventEmitter = require("events");
  1. 定义一个具备firstNamelastNamegreeting属性且名为Person的新物件,并继承events
function Person(firstName, lastName){
  this.firstName = firstName;
  this.lastName = lastName;
  this.greeting = "Hello, " + this.firstName +this.lastName;
}

util.inherits(Person, EventEmitter);
  1. Person物件的原型中加入greet方法,并在方法中加入greetTime事件的触发动作。
Person.prototype.greet = function(){
  console.log(this.greeting);
  this.emit("greetTime");
}
  1. 建立一个Person新物件、注册greetTime事件,并呼叫greet
let chwk = new Person("chw","k");

chwk.on("greetTime", function(){
  console.log(new Date());
});
chwk.greet();
  1. 执行除错後,印出的成果包含原型中定义的greet方法所印出的字串及被其中触发功能所触发的greetTime事件所印出的时间字串。

https://ithelp.ithome.com.tw/upload/images/20210921/20139980vZx8aRgGgr.png

Class(ES6)的继承

记得Day4有提到ES6标准所带来的语法糖-Class,在继承的概念部分也提供了简洁的语法,透过精简的extends就可以直接加上母物件名称以继承其属性,一样以EventEmitter为例来看与物件继承语法的差异。

实作看看:以EventEmitter为例

  1. 引入eventsModule。
let EventEmitter = require("events");
  1. 定义一个具备firstNamelastNamegreeting属性及greet方法的PersonClass,以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");
  }
}
  1. 建立一个新的Person物件、注册greetTime事件并呼叫greet方法。
let chwk = new Person("chw", "k");

chwk.on("greetTime", function(){
  console.log(new Date());
});
chewk.greet();
  1. 执行除错後,印出的成果包含原型中定义的greet方法所印出的字串及被其中触发功能所触发的greetTime事件所印出的时间字串。

https://ithelp.ithome.com.tw/upload/images/20210921/201399809WYpEdXLzI.png

小结

继承的概念让物件得以使用其他已定义好的物件数性及方法,减少重复定义方法及物件,使物件的建立更加快速、简便。

参考资料

https://developer.mozilla.org/zh-TW/docs/Web/JavaScript/Reference/Operators/super

Learn and Understand NodeJS [课程]


<<:  Day9 Collectionview小实作3

>>:  {DAY9} SQL查询语法1

30天程序语言研究

今天是30天程序语言研究的第十一天,研究的语言一样是python,今天主要学习的是问答程序 网址:h...

[Day9] - Docker Compose 介绍与实作

在上一篇我们学习了 Docker 的基础操作,相信大家都可以感觉到 Docker 惊人的方便性吧! ...

公家机关 资讯安全 远端连线 录影 VNC 被控端 呼叫 主控端

公家机关 资讯安全 远端连线 录影 资讯安全稽核 使用UltraVNC 反向连线 VNC 被控端 呼...

Day3. 从Example Code瞧瞧Matter.js的盘古开天

说好今天要来谈谈昨天的那段扣里,究竟写了些什麽。 为什麽可以像杰克一样神奇,产生出这样的画面呢? 我...

Batch Processing (3-1) - MapReduce Reduce-Side Joins and Grouping

Reduce-Side Joins and Grouping 当 MapReuce Job 执行时,...