摘要:对象与属性让我们保持耐心,再梳理一下对象与属性的关系对象是属性的集合,当对象的属性是函数时,我们将其称之为方法。
对于对象的一般认识这篇博文的主要目的是为了填坑,很久之前我发表了一篇名为关于JavaScript对象中的一切(一) — 对象属性的文章,想要谈一谈JavaScript对象,可那时只是贴了一张关于这个主题的思维导图,今天我会针对这一主题进行展开,将JavaScript对象一些平常不太常用的知识系统的整理出来,方便阅读者的记忆与理解。在看完本篇文章后,你大可跳转回这篇博文,并保存思维导图,以加强记忆。
在开始正题之前,让我们先凭直觉回忆一下我们对JavaScript对象的一般认识:
对象是一个引用类型值;
创建对象的方式有两种形式:“字面量形式”与“构造函数形式”;
对象的属性可以随时修改,且一旦改动,所有引用对象的地方,其属性值均会被改变(这也是引用类型的特点);
对象可以通过原型链实现继承;
以上这些应该是JavaScript开发者对“对象”这一概念最基本的认识。但实际上,JavaScript给予了开发者以更细致颗粒度操作/设置对象及其属性的能力,这些能力是什么?如何运用?这就是接下来我们要谈到的话题。
对象与属性让我们保持耐心,再梳理一下对象与属性的关系:对象是属性的集合,当对象的属性是函数时,我们将其称之为“方法”。
我们不妨建立这样的心智模型:对象是一只蓝色的(这里的颜色特别重要,因为实际上,变量本身也是一只大章鱼,但她的身体却是红色的?)大章鱼,章鱼的每一只触手都握着一个属性的内存地址卡片,当要读取对象中的属性时,章鱼的触手会随着卡片上的地址拿到相应的数据值,并返还给用户(就是你)。
接下来,让我们从对象与属性两个角度切入,谈谈一些我们可能平常不太接触到的知识。
对象的内部方法与特征属性让我们先定义这两个名词:
内部方法是指:JavaScript于对象内部定义的,用户不可访问/修改的方法;
特征属性是指:用来描述对象/属性一些特性(如是否可配置?是否可迭代)的属性;
简单来说,JavaScript中对象和属性都“藏”有一些我们不太常用的属性和方法,我们的目的就是揪出它们,分析它们的用法和意义,然后对JavaScript对象有一个完整清晰的认识。
让我们先从JavaScript对象的内部方法说起:
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!喜欢这篇文章吗?别忘了在下方? 点赞让我知道。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/90052.html
摘要:但好在还给我们提供了一个方法,每一个对象都有这样一个方法,专门用来判断某个属性是否是该对象的私有属性。如果你想要用对象字面形式,你只能在创建对象时定义访问器属性。在中,我们使用冻结一个对象,并且使用来判断一个对象是否被冻结。 说完了对象那些不常用的冷知识,是时候来看看JavaScript中对象属性有哪些有意思的东西了。 不出你所料,对象属性自然也有其相应的特征属性,但是这个话题有点复杂...
摘要:请注意是创建一个全局对象的属性,而不是声明了一个全局变量。由于变量声明自带不可删除属性,比较跟,前者是变量声明,带不可删除属性,因此无法被删除后者为全局变量的一个属性,因此可以从全局变量中删除。下期预告前端面试你所不知道系列伪类和伪元素 写在开始 又到了一年的伊始,很多人可能因为各种原因想换一份工作,而找工作难免遇到各种各样头痛的面试题,于是我打算写一个系列,关于面试中最常见或者前端一...
摘要:已经逐渐替代被全世界的开发者广泛使用。函数将一个对象转换成文本化的。不能被文本化的属性会被忽略。和例外情况在数组中,不可被的元素用填充。自从年双十一正式上线,累计处理了亿错误事件,得到了金山软件等众多知名用户的认可。 译者按: 老司机们,你知道JSON.stringify还有第二个和第三个可选参数吗?它们是什么呢? 原文: What you didn’t know about JSO...
摘要:的异步函数不会马上执行,而是先注册监听,等到事件触发了,就将这个回调函数压入事件队列中,等待顺序运行的任务队列空了以后,再执行事件队列中的函数。 第五章 语法 {…}一个代码块会返回最后一个语句的结果值,可以用eval()去获得(不建议),{}在不同情况下意思不同,可以是语句块、对象常量、解构赋值或者命名函数参数,在代码块中有一个坑,{}+[]//0,{}是一个空执行块(不执行任...
摘要:正在失业中的课多周刊第期我们的微信公众号,更多精彩内容皆在微信公众号,欢迎关注。若有帮助,请把课多周刊推荐给你的朋友,你的支持是我们最大的动力。是一种祸害译本文浅谈了在中关于的不好之处。浅谈超时一运维的排查方式。 正在失业中的《课多周刊》(第3期) 我们的微信公众号:fed-talk,更多精彩内容皆在微信公众号,欢迎关注。 若有帮助,请把 课多周刊 推荐给你的朋友,你的支持是我们最大的...
阅读 2513·2023-04-26 01:44
阅读 2531·2021-09-10 10:50
阅读 1373·2019-08-30 15:56
阅读 2174·2019-08-30 15:44
阅读 483·2019-08-29 11:14
阅读 3400·2019-08-26 11:56
阅读 2965·2019-08-26 11:52
阅读 883·2019-08-26 10:27