JavaScript 这个语言有一个特性,所以资料其实都是以『物件』方式做建立,因此也可以说 JavaScript 所有资料都有原型,而到底什麽是原型?
单纯用文字比喻的话,原型其实像是蓝图,我们可以在原型设定各种属性、方法,用来帮助我们建立实体资料,而实体资料则会带者原型上的属性以及方法,以下面图片为例:
上述图片只是帮助思考『原型的概念』而已,实际程序码来说的话,我们会使用函示建构式、ES6 的 Class 来当作衣服的原型,而实体资料则是:
const blackT = {
color:'black',
material:'棉',
size:'L'
}
const darkBlueT = {
color:'darkBlue ',
material:'聚酯纤维',
size:'XL'
}
这章节还不会讲到如何建立原型,不过我们先将 blackT
物件丢到 console 并且再次呼叫,会显示刚刚建立的 blackT
物件,不过物件的属性底下还会有 [[Prototype]]
的东西,而这个 [[Prototype]]
其实就是今天介绍的原型。
值得一提的是原型本身还可以再继承原型,因此这样一段一段,因此又被称做原型链,继续使用衣服图做范例:
P.S 过去文章会写做 __proto__
而不是 [[Prototype]]
,这是因为 JavaScript 这语言本来就有对每笔资料设置 [[prototype]]
,ES5 之前并没有标准方法来查询这个隐藏属性,因此浏览器使用 __proto__
这个方法来达成相关需求。
现在因为浏览器更新,所以 __proto__
改为正式的 [[Prototype]]
不过实际上还是可以使用 __proto__
等等相关方法,以上方 blackT
为例,使用 console.log(blackT.__proto__)
仍可以查到他的相关原型。
以下是原型的特性:
这边直接使用程序码举例比较好懂
const array = [1,2,3]
console.log(array)
这边的 array 就是个实体,点开 console 上的 array
里面的 [[Prototype]]
就是原型,这点上面有提到。
而 array 中的 [[Prototype]]
有着许多我们常用的 阵列方法,比如 forEach()
、 filter()
,这些方法正是透过原型继承来的方法,这也提到一个重点:『若实体要取用原型中的方法,便是使用 .
这个运算子来使用』,这个重点也和上面提到的 『一样具有物件的特性』是相同的。
眼尖的朋友就会发现在 forEach
、 filter
这些方法底下,还有一层 [[Prototype]]
,这正是上面提到的,原型上还有原型,同时也是『原型向上查找的特性』,同时不管是阵列、还是函示在最上层的原型都会是物件。
接下来可以验证一下「原型的方法与属性是共用的」这一点
const array = [1,2,3]
array.__proto__.dobuleNum= function() {
return this.map(function(item) {
return item*2})
}
console.log(array.dobuleNum()) //[2, 4, 6]
范例中使用 __proto__
来新增 dobuleNum
这个方法,而 dobuleNum
就是将阵列中的值 *2 在回传。透过 console.log(array.dobuleNum())
也会确实看到回传 [2,4,6]
的值。
接者我们在新增一个阵列变数来试试看上面观念是否正确。
const newArray = [55,66,77]
console.log(newArray .dobuleNum()) //[110, 132, 154]
最後这边要提醒一下,实做中是不建议使用 __proto__
来制作原型方法,主要是这方法会污染所有原型,并让原型来源难以查找、确认,比较实际的方法是使用原型的建构式,这写是下一章节的主题。
<<: [Day18] 刺激! 居家上班之老板v.s.员工偷懒攻防战!
>>: ESP32_DAY3 开发环境-Visual Studio Code
在上一篇,我们把 Ktor client 加到 Dagger 的 object graph 内。现在...
上一篇我们约略介绍了BeautifulSoup的功用及使用方式 这次我们要来继续介绍Beautifu...
要进入写测试之前呀~我们必须要先了解为什麽要写测试,及我们会说明一种测试的开发方法(TDD) 写测试...
在新闻中,最常见的资安事件,就是资料外泄的问题,而通常会发生这类型的事件不外乎就是未将资料或是其他基...
大家好我是乌木白,今天要衔接昨天的内容,我们今天继续讨论AJAX! 什麽是 HTTP 请求方法? ...