追求JS小姊姊系列 Day20 -- 工具力,原来如此:继承。

前情提要:

在上一集解释了工具力的来源

方函式:还记得之前提到的建构式模式吗?
只要提供一个原型,就能大量产生的那个能力。其实,除了东西能复制,人也是可以的喔

function TopToolMan(task,remember){
    this.task = task || {daily:["洗衣服","载男友"],weekily:["买当周消耗品"]};
    this.remember = remember;
    this.forbid = ["不可以色色","不可以妄想"]
    this.log = function(){
    console.log("不知为何要存在")
    }
}
let x = new TopToolMan("采买","不需要");

:你的内在(原型)看起来还挺压抑的...

方函式:...那不是重点,重点是我所创造出来的人,若没有特定要求(如下图)

let doNothingClone = new TopToolMan();

还是会保有我的基本记忆与能力。这就是透过继承来达成。

这样子,今天不论她需要的是:

  1. 有人去台北排O果新机
let goToTaipeiToBuyPhone = new TopToolMan("买手机","顺便买伴手礼");

他记忆的任务跟会记得的就是你所交代(赋予) 的内容。

  1. 又需要人去屏东买猪脚(?)
let x = new TopToolMan("采买","不需要");

方函式:同一个时间下,要几个人就能有几个人(实例),而且都能去处理不同的事情。

想建构复制人的你,要知道的小缺点

每个复制人内都一个的log function,虽然是在做同一件事,但都会个别占用了空间,所以可以视为不同的function

那要怎麽办? 新增在原型上

function TopToolMan(task,remember){
    this.task = task || {daily:["洗衣服","载男友"],weekily:["买当周消耗品"]};
    this.remember = remember;
    this.forbided = ["不可以色色","不可以妄想"]
    
    topToolMan.prototype.log = function(){
    console.log("不知为何要存在")
    }
}

上面的行为是等於在原型上新增一个属性或方法
这样一来,所有TopToolMan创建的instance,都能透过血继限界中(prototype chain)取得这个能力与想法。


背後比较正经的原理

一切原理的起因,要说到JavaScript最初的设计由来:所谓物件导向的设计

以下会依序讲述我目前所能理解的部分:

JS设计是以原型为基础的物件导向(OOP)设计

先知道:物件是最基本的程序单位。

原型的本身
还记得昨天的文章测试:原型链的顶部为Object.prototype这件事吗?

console.log(typeof Object.prototype); // "Object"

原型本身也是一个Object,符合所谓的物件导向设计的:物件是最基本的程序单位。


原型为基础的程序设计,并没有真正的Class

所以无法透过类的层级,来达成属性、方法的继承, 那JS怎麽做到继承这件事呢? 你至少可以先知道new扮演了什麽角色。

重新理解new

我们再来制作一个复制人,这次来看看:
实际上在创造每个复制人时,会依序执行以下的步骤

function TopToolMan(task,remember){
    this.task = task || {daily:["洗衣服","载男友"],weekily:["买当周消耗品"]};
    this.remember = remember;
    this.forbided = ["不可以色色","不可以妄想"]
    
    topToolMan.prototype.log = function(){
    console.log("不知为何要存在")
    }
}
let x = new topToolMan("采买","不需要");
  1. 创出一个新的object,名称为 x
  2. 接着x__proto__会指向TopToolManprototype,才能继承原型链。
  3. this会指向x,呼叫topToolMan这个建构函式
  4. 回传x

小结

  1. JS是以原型物件为基础 的程序设计,所以它的继承方式是透过原型链(Prototype chain)、new来实现
  2. 执行new这个动作时,实际上会让物件与原型连结。

-- to be continued --


那今天就到这边搂!
每天的休息,是为了後面的追求,明天见。


reference:

你懂 JavaScript 吗?#19 原型(Prototype)
[笔记] 了解JavaScript中原型(prototype)、原型链(prototype chain)和继承(inheritance)的概念
该来理解 JavaScript 的原型链了


<<:  [从0到1] C#小乳牛 练成基础程序逻辑 Day 20 - nested for loop 印出99乘法表

>>:  Docker云端:NextCloud

[DAY29]Line查询Postegre

记录完後我们就要开始查询了以下是蛮简单的查询方式。 import psycopg2 import o...

[Day10] TS:什麽!Conditional Types 中还能建立型别?使用 infer 来实作 ReturnType 和 Parameters

今天会来说明 TypeScript 中内建 ReturnType 和 Parameters 的原始...

Day13 SwiftUI 06 - WebView

接下来我们来看看在SwiftUI 怎麽使用WebView 网页的元件,SwiftUI 框架 有一个缺...

day 1 - 魔鬼藏在细节里

前言 程序写了一阵子之後,工程师就会发展出自己习惯的模式,小到命名方式,大到系统架构,而在我们团队中...