学JS的心路历程-物件与原型(一)
前两天说明面向对象的三大特性及JS不符合面向对象,只能称作支持面向对象而已,今天我们来看看JS的原型继承。
首先我们先来看,什么是原型(vmwork):
两个物件之间的原型关系(prototype relationship)跟继承(inheritance)有关:
每个物件都可以有另一个物件作为它的原型(prototype),如此一来,前者就会继承其原型的所有特性。
一个物件藉由内部特性(property)[[Prototype]]来指定其原型。
每个物件都有这个特性,但它可能是null。由[[Prototype]]连接起来的物件串链(chain of objects)被称作原型串链(prototype chain)。
《Speaking JavaScript第十七章-物件与继承》
我相信第一次看到这段话的人肯定是满脸问号,我也是一样。

没关系我们一步一步慢慢来看!
简单来说,可以定义一些自动成为可让其它物件存取的属性和功能
在JS中,我们可以很容易的建立一个物件,也可以轻易的修改和删除已经指派给物件的属性。
var obj = {
a:'apple',
b:function(){},
c:{},
d:[]
};
obj.a = [];
obj.b =“banana”;
delete obj.c;
在开发过程中,我们都会尽量避免重复造轮子,也就是尽可能的重复利用现有的代码。
所以一种可重复利用的代码,并帮助我们把程序组织好的方式就是「继承」,把存在于某个物件上的功能延伸到其他物件上。
在JS中,继承就是用「原型」实作出来的。
透过原型,物件可以存取属于其他物件的属性
const Jason = {
CSS:true
};
const Turtle = {
JS:true
};
const Kai = {
Vue:true
};
我们刚刚建立了三个物件,每个物件都有一个自己才能存取的属性。
可以利用in测试物件能否存取某个属性:
“JS”in Jason;//false
“CSS”in Jason;//true
如果我们想要Json存取Turtle的JS属性,可以用Object.setPrototypeOf,需要两个参数(argument),并把第二个参数设为第一个参数的原型,所以我们可以这样做:
Object.setPrototypeOf(Jason,Turtle);
“JS”in Jason;//true
现在我们可以透过Jason存取JS属性了,这是因为每当像Jason存取JS时,便会在物件原型里搜寻该属性,因为我们已经让Jason继承了Turtle让它成为其原型,所以可以存取Turtle的属性。
在JS中,物件原型是物件的内部属性,无法直接存取,所以会标示为[[Prototype]]。
那如果我们想要Jason也能存取Kai的属性,相信很多人会直接这样写:
Object.setPrototypeOf(Jason,Kai);
“JS”in Jason;//false
“Vue”in Jason;//true
Jason的确可以存取Kai的属性了,但同时Kai也取代了Turtle成为了它的原型(leafor)。
那我们该怎么做呢?我们前面有提到过「每个物件都有[[Prototype]]特性可以来来指定其原型。」,所以Turtle成为Jason原型后,也可以指定Kai当作其原型,这个行为称为「原型串链(prototype chain)」。
Object.setPrototypeOf(Jason,Turtle);
Object.setPrototypeOf(Turtle,Kai);
“JS”in Jason;//true
“Vue”in Jason;//true
可以看到说Jason已经可以顺利存取Turtle及Kai的属性了!
那么,今天就到这边,一样如果有错误及来源未附上也欢迎留言指正,那么我们明天见。
学JS的心路历程-物件与原型(一)的更多相关文章
- 学JS的心路历程 -物件与原型(二)
昨天有提到说Object.setPrototypeOf可以指定一个物件为另一个物件的原型,但有想过到底这个原型,也就是[[Prototype]]最终会到何处吗? 答案是Object.prototype ...
- 学JS的心路历程-物件与原型(三)
昨天有说明到函式与建构式的原型,及指定建构式函式原型为另一个建构式函式,但其实这会造成复写constructor的问题. 复写constructor的问题(vmwork) 我们昨天有提到「建构式函式可 ...
- 学JS的心路历程 - JS的Class
没错,你没有看错,虽然前面说JS是原型继承,但在ES6以后新增了class关键字!!! 不过底层实作仍然是以原型继承方式进行,所以基本上算是一个语法糖. 今天我们就来看一下如何使用吧! class 首 ...
- 学JS的心路历程-JS支持面向对象?(二)
昨天讲了面向对象的继承,今天我们来谈谈多态和封装吧! 多态polymorphism 抽象讲法解释,就是使用单一界面操作多种型态的物件 继承父类别,定义与父类别中相同的方法,但实作内容不同,称为复写(o ...
- 学JS的心路历程-JS支持面向对象?(一)
昨天在看Prototype看到JS支持面向对象,被前辈问到说那什么是面向对象?JS是面向对象语言吗? 便开始了一连串艰辛爬文过程,今天就来看一下两者有什么差异吧(rgwyjc)! 首先面向对象有三大特 ...
- 学JS的心路历程-for of和for in
我们在刚入门JS时候,说到要跑出数组的每个值肯定都是这样子: var arr = [1,2,3,4,5,6]: for(let i = 0:i < arr.length:i++){ consol ...
- 学JS的心路历程 -函式(三)this
this是什么,取决于被呼叫的呼叫地点. 昨天有提到说,呼叫函式时候会传递隐含参数:arguments和this并讲解了arguments,今天我们就来探讨this吧! 什么是this 我们都会呼叫函 ...
- 学JS的心路历程Day26 - PixiJS -入坑
后来知道也可以透过canvas让网页动起来! 而PixiJS是使用WebGL在canvas上绘制内容与制作动态 且同时有下列特色: 支持多点触控 掩码与混合模式 可外加WebGL滤镜 多装置支持 等等 ...
- 学JS的心路历程-Promise(三)
今天我们来说then一些特殊情况以及Promise.all()与Promise.race(). 我们都知道函式作为参数传入时,可以参照的方式传入,也能传入时执行拿回传值作使用: function us ...
随机推荐
- raid1与raid5
raid 1 就是两个磁盘同时读同时写, 当其中一个坏了 不影响使用, 直接更换一个,这样磁盘的容量只有一个盘的raid 5 就是 N-1个磁盘的容量,当其中任何一个磁盘坏,不影响使用,更换一个就可以 ...
- js判断假值
js中的假值:在JavaScript中,false.null.0.空字符串.undefined 和 NaN被称为假值. 需要注意的是,这种方法字符串类型会返回true哦,比如'false','0' B ...
- HTTP中Get、Post、Put与Delete。了解一下!
1.GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改.增加数据,不会影响资源的内容,即该请求不会产生副作用.无论进行多少次操 ...
- VMware扩展Linux根目录磁盘空间(Centos版本)
1.Centos 关机,选择编辑虚拟机设置,硬盘,在实用工具那里选择“扩展”,指定你需要的存储大小 2.启动客户机操作系统Centos,查看磁盘情况 输入指令 fdisk -l 显示结果如下 Disk ...
- CMD下的netstat命令
查询端口启用情况 netstat -ano|findstr 80
- Xshell 本地上传、远程下载文件
1.Xshell登录工具在创建会话的时候,点击最下面的ZMODEM,可以填写下载的路径和加载的路径:2个路径可以一样也可以不一样: 在下载的时候可以下载到相应的路径去.(我设置的是下载前始终询问) 2 ...
- javascript中的立即执行函数(function(){…})()
javascript中的立即执行函数(function(){…})() 深入理解javascript中的立即执行函数,立即执行函数也叫立即调用函数,通常它的写法是用(function(){…})()包 ...
- ip黑白名单防火墙frdev的原理与实现
汤之盘铭曰 苟日新 日日新 又日新 康诰曰 作新民 诗曰 周虽旧邦 其命维新 是故 君子无所不用其极 ——礼记·大学 在上一篇文章<DDoS攻防战 (二) :CC攻击工具实现与防御理论>中 ...
- beyondCompare工具使用
1.下载beyondcompare (从官网下载) 2.载入.class文件比对 参见: beyond compare 对class文件反编译及比较 (https://blog.csdn.net/ ...
- APP-2-Hbuilder开发环境搭建
1.Hbuilder下载 http://www.dcloud.io/hbuilderx.html 2.夜神模拟器下载 https://www.yeshen.com/ 3.chrome浏览器下载 htt ...