JS 07 - 原型方法

大家好!

昨天我们成功使用建构函式建立一个新物件,但是建立物件後能做什麽呢?
今天我们要介绍的就是,在物件原型中新增共用方法!


物件特性

如果要推入项目至阵列,我们会使用 push 方法。
那麽,物件是不是也能推入项目呢?让我们试试看:

([]).push(0); // 1
({}).push(0); // TypeError: {}.push is not a function

怎麽会这样?为什麽阵列能使用的方法,物件却不能使用?
让我们想想看,阵列的索引能直接累加,但是物件的属性不能直接累加,这样要怎麽推入项目呢?

简而言之,阵列和物件的方法不能共用,是因为它们拥有不同的特性
然而,如果真的想要共用方法的话,其实不是没有办法,这就是接下来要实作的物件原型。


物件方法

我们接续昨天提到的铁人赛案例吧!
还记得昨天我们建立的建构函式吗?

发文日数少於 30 天,只要更新物件;
发文日数超过 30 天,需要对物件新增 status 属性并赋值。

let record;
record = new Ironman('Felix', '2021-09-16', 1);

/* ... */

record = new Ironman('Felix', '2021-10-15', 30);
record.status = true;

record = new Ironman('Felix', '2021-10-16', 31);
record.status = true;

但是,如果 Felix 有余力撰写更多文章,那麽岂不是每次更新物件後,都要再新增 status 属性和赋值?
是这样没错,物件没有共用方法的时候,物件的属性和值只能手动更新。

接下来我们就要介绍如何新增物件的共用方法了!


原型方法

如果建构函式是物件模板,那麽物件原型就是共用方法:

/* 新增共用方法 */
Ironman.prototype.finish = function () {
    /* 发文日数少於 30 天不允许执行函式 */
    if (new Date(this.date) < new Date('2021-10-15')) return;
    this.status = true;
    console.log('Congratulations!');
};

如此一来,只要是 2021-10-16 之後的任何一天,都能执行 finish 共用函式。
执行 finish 後,就会自动 Log 恭喜的讯息,并自动将物件的 status 属性设为 true

let record;

record = new Ironman('Felix', '2021-09-16', 1);
record.finish(); /* 不执行 */
record; // { name: 'Felix', date: '2021-09-16', post: 1 }

record = new Ironman('Felix', '2021-10-15', 30);
record.finish(); // Log: Congratulations!
record; // { name: 'Felix', date: '2021-10-15', post: 30, status: true }

record = new Ironman('Felix', '2021-10-16', 31);
record.finish(); // Log: Congratulations!
record; // { name: 'Felix', date: '2021-10-16', post: 30, status: true }

建构函式搭配物件原型後,不仅能省事,也能减少不必要的程序码,是不是棒极了呢?

差不多也到尾声了。
如果对文章有任何疑问,欢迎於下方提问和建议!
我是 Felix,我们明天再见!


<<:  Python 练习

>>:  第十七天:该用 implementation 还是 compile?

《Day 29》【软件资料库】SQLServer 镜像建置PART 2

倒数第二天罗!赛程最终第二十九天~ 再次分享专业的资料库建置~ 大家可以参考文章如下 https:/...

安装与反安装--软件的彼得定律对系统的意义

今天要来讲的东西,主要是来自笔者以前看过很喜欢的文章(https://www.ithome.com....

Day 04 - Spring Boot 的前世今生

结束了恼人的环境安装,但我们还没有要开始Spring Boot 的实作,因为在开始学习一项技术之前,...

[D26] 物件侦测(7)

YOLO 是一个不断改进和优化的物件侦测系列,除了前三个版本,在 2020 年时,YOLOv4 也问...

[Day4]专案始动-续(前端篇)

今天我们继续来设定我们的架构,首先先把index.js的预设内容给删除掉。 透过检视原始码,可以取得...