这篇博文的主要目的是为了填坑,好久以前我发表了一篇名为关于JavaScript对象中的一切(一) — 对象属性的文章,想要谈一谈JavaScript对象,可那时只是贴了一张关于这个主题的思惟导图,今天我会针对这一主题进行展开,将JavaScript对象一些日常不太经常使用的知识系统的整理出来,方便阅读者的记忆与理解。在看完本篇文章后,你大可跳转回这篇博文,并保存思惟导图,以增强记忆。html
在开始正题以前,让咱们先凭直觉回忆一下咱们对JavaScript对象的通常认识:函数
以上这些应该是JavaScript开发者对“对象”这一律念最基本的认识。但实际上,JavaScript给予了开发者以更细致颗粒度操做/设置对象及其属性的能力,这些能力是什么?如何运用?这就是接下来咱们要谈到的话题。spa
让咱们保持耐心,再梳理一下对象与属性的关系:对象是属性的集合,当对象的属性是函数时,咱们将其称之为“方法”。code
咱们不妨创建这样的心智模型:对象是一只蓝色的(这里的颜色特别重要,由于实际上,变量自己也是一只大章鱼,但她的身体倒是红色的?)大章鱼,章鱼的每一只触手都握着一个属性的内存地址卡片,当要读取对象中的属性时,章鱼的触手会随着卡片上的地址拿到相应的数据值,并返还给用户(就是你)。htm
接下来,让咱们从对象与属性两个角度切入,谈谈一些咱们可能日常不太接触到的知识。对象
让咱们先定义这两个名词:blog
简单来讲,JavaScript中对象和属性都“藏”有一些咱们不太经常使用的属性和方法,咱们的目的就是揪出它们,分析它们的用法和意义,而后对JavaScript对象有一个完整清晰的认识。继承
让咱们先从JavaScript对象的内部方法提及:ip
JavaScript对象有如下三个内部方法:内存
[[Put]]
:用来建立对象属性,当新建对象属性时被调用,就像命令蓝色章鱼长出一只触角,握住一张内存地址卡片;[[Set]]
:用来修改对象属性的值,当修改对象属性时被调用,能够想象为命令蓝色章鱼的某个触角放下已有的内存地址卡片,改换另外一张;[[Delete]]
:用来删除对象属性的值,当使用delete
关键字删除对象属性时被调用,能够想象为砍掉蓝色章鱼的一只触角(别担忧,蓝色章鱼并不在乎);讲到这里咱们能够很好的说明当设定某对象属性值为null
时会发生什么了,那只蓝色章鱼的触角还在,只是拿了一张空白卡片!
let obj1 = { x: null, } console.log(obj1.x) // null let obj2 = { y: null, } delete obj2.y console.log(obj.y) // undefined(当访问对象不存在的属性时,一概获得undefined值)
接着咱们来谈谈对象的特征属性。
很遗憾对象的特征属性并不如属性那么多,咱们这里先介绍一个,名为:[[Extensible]]
,它的值是一个布尔值,用来表示对象自己是否能够被修改,简单来讲,即是是否能够添加属性(实际上,还有一个内部的[[proto]]
特征属性)。
为了配置这个属性,JavaScript给了咱们一个专门的方法:Object.preventExtensions()
,同时,为了检测一个对象是不是可扩展的,JavaScript还给咱们提供了Object.isExtensible()
方法,让咱们看看它们的用法:
let obj = { x: 1, } console. log(Object.isExtensible(obj)) // true Object.preventExtensions(obj) console.log(Object.isExtensible(obj)) // false obj.y = 2 console.log('y' in obj) //false
可见,经过这个特征属性,咱们能够建立一个比较保守的不可扩展对象,当咱们了解属性的特征属性后,在本文最后你会看到,咱们最终是如何制造出一个封闭性极强的对象的(不只不可扩展,连属性也不能被改变)。
让咱们小结一下:JavaScript对象有三个内部方法和一个特征属性,他们分别是:
[[Put]]
,[[Set]]
,[[Delete]]
;[[Extensible]]
;在下一篇文章中,咱们会一块儿梳理对象属性的一些鲜为人知的小秘密,休息一下,而后咱们继续。
? Hey!喜欢这篇文章吗?别忘了在下方? 点赞让我知道。