对象

理解对象

对象可以定义为一组属性的无序集合。严格来说,这意味着对象就是一组没有特定顺序的
值。对象的每个属性或方法都由一个名称来标识,这个名称映射到一个值。可以把对象想象成一张散列表,其中的内容就是一组名/值对,值可以是数据或者函数。

属性的类型

对象中会有一些内部特性来描述属性的特征。这些特性是由为 JavaScript 实现引擎的规范定义的,开发者不能在 JavaScript 中直接访问这些特性。为了将某个特性标识为内部特性,规范会用两个中括号把特性的名称括起来,比如[[Enumerable]]
属性分两种:数据属性访问器属性

数据属性

数据属性包含一个保存数据值的位置。值会从这个位置读取,也会写入到这个位置。数据属性有 4个特性描述它们的行为。

[[Configurable]]:表示属性是否可以通过 delete 删除并重新定义,是否可以修改它的特性,以及是否可以把它改为访问器属性。默认情况下,所有直接定义在对象上的属性的这个特性都是 true,如前面的例子所示。
[[Enumerable]]:表示属性是否可以通过 for-in 循环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是 true,如前面的例子所示。
[[Writable]]:表示属性的值是否可以被修改。默认情况下,所有直接定义在对象上的属性的这个特性都是 true,如前面的例子所示。
[[Value]]:包含属性实际的值。这就是前面提到的那个读取和写入属性值的位置。这个特性的默认值为 undefined。

要修改属性的默认特性,就必须使用 Object.defineProperty()方法。这个方法接收 3 个参数:
要给其添加属性的对象、属性的名称和一个描述符对象。最后一个参数,即描述符对象上的属性可以包
含:configurable、enumerable、writable 和 value,跟相关特性的名称一一对应。根据要修改
的特性,可以设置其中一个或多个值。比如:

let person = {};
Object.defineProperty(person, "name", { writable: false, value: "Nicholas"
});
console.log(person.name); // "Nicholas"
person.name = "Greg";
console.log(person.name); // "Nicholas"

这个例子创建了一个名为 name 的属性并给它赋予了一个只读的值"Nicholas"。这个属性的值就
不能再修改了,在非严格模式下尝试给这个属性重新赋值会被忽略。在严格模式下,尝试修改只读属性
的值会抛出错误。

访问器属性

访问器属性不包含数据值。相反,它们包含一个获取(getter)函数和一个设置(setter)函数,不过这两个函数不是必需的。在读取访问器属性时,会调用获取函数,这个函数的责任就是返回一个有效的值。在写入访问器属性时,会调用设置函数并传入新值,这个函数必须决定对数据做出什么修改。访问器属性有 4 个特性描述它们的行为。

[[Configurable]]:表示属性是否可以通过 delete 删除并重新定义,是否可以修改它的特性,以及是否可以把它改为数据属性。默认情况下,所有直接定义在对象上的属性的这个特性都是 true。
[[Enumerable]]:表示属性是否可以通过 for-in 循环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是 true。
[[Get]]:获取函数,在读取属性时调用。默认值为 undefined。
[[Set]]:设置函数,在写入属性时调用。默认值为 undefined。

访问器属性是不能直接定义的,必须使用 Object.defineProperty()。下面是一个例子:

// 定义一个对象,包含伪私有成员 year_和公共成员 edition
let book = { year_: 2017, edition: 1
};
Object.defineProperty(book, "year", { get() { return this.year_; }, set(newValue) { if (newValue > 2017) { this.year_ = newValue; this.edition += newValue - 2017; } }
});
book.year = 2018;
console.log(book.edition); // 2

定义多个属性

在一个对象上同时定义多个属性的可能性是非常大的。为此,ECMAScript 提供了 Object.defineProperties()方法。这个方法可以通过多个描述符一次性定义多个属性。它接收两个参数:要为之添加或修改属性的对象和另一个描述符对象,其属性与要添加或修改的属性一一对应。比如:

let book = {};
Object.defineProperties(book, {year_: {value: 2017,},edition: {value: 1,},year: {get() {return this.year_;},set(newValue) {if (newValue > 2017) {this.year_ = newValue;this.edition += newValue - 2017;}},},
});

javaScript对象的内部特性相关推荐

  1. 我对javascript对象的理解

    前言 JavaScript这门语言除了基本类型都是对象,可以说JavaScript核心就是对象,因此理解JavaScript对象及其种种特性至关重要,这是内功.本文介绍了我对es5对象,原型, 原型链 ...

  2. javascript对象包含哪些要素_重学JavaScript 对象

    栏目为大家介绍JavaScript的对象,重新认识. 这里我们继续学习两个比较重要的类型,就是 Object 和 Symbol.我们主要讲的是 Object,相对 Object 来说 Symbol 只 ...

  3. JavaScript 对象所有API解析【2020版】

    写于 2017年08月20日,虽然是2017年写的文章,但现在即将2020年依旧不过时,现在补充了2019年新增的ES10 Object.fromEntries().发到公众号申明原创.若川顺便在此提 ...

  4. JavaScript 对象总结

    JavaScript 中的所有事物都是对象:字符串.数值.数组.函数... 此外,JavaScript 允许自定义对象 JavaScript 对象 对象只是一种特殊的数据.对象拥有属性和方法 访问对象 ...

  5. JavaScript对象和函数表达式

    JavaScript对象和函数表达式 理解对象 创建自定义对象的最简单方式就是创建一个 Object 的实例,然后再为它添加属性和方法,如下所示 var person = new Object(); ...

  6. javaScript系列 [02]-javaScript对象探析

    [02]-javaScript对象探析 题记:多年前,以非常偶然的方式关注了微信公众号"面向对象",本以为这个公众号主要以分享面向对象编程的干货为主,不料其乃实实在在的猿圈相亲平台 ...

  7. JavaScript基础: ES6新特性---Symbol

    简介 在ES6中引入的一种新的基本数据类型Symbol.这个类型不像是number或者String让人使用起来那样顺手好理解,为什么是这样呢?是不是因为其是新特性,所以不熟是正常的? 自然不是因为箭头 ...

  8. 详解JavaScript对象深拷贝

    详解JavaScript对象深拷贝 在几乎所有编程语言中,对象都以引用形式保存给变量.复制给其他变量.JavaScript语言也是如此.因此简单的进行赋值操作进行复制仅仅是对对象数据的引用地址进行一个 ...

  9. JavaScript[对象.属性]集锦

    作者: 蓝色理想 SCRIPT 标记? 用于包含JavaScript代码.? 属性? LANGUAGE 定义脚本语言? SRC 定义一个URL用以指定以.JS结尾的文件? windows对象? 每个H ...

最新文章

  1. Boost signals(1) 基本介绍
  2. android系统可以破吗,你的手机系统破到什么程度?一键查安卓漏洞
  3. 深度学习入门篇--手把手教你用 TensorFlow 训练模型
  4. boost::geometry::enrich_intersection_points用法的测试程序
  5. Boost:使用静态c ++内核语言扩展以进行编译和 执行模板化的c ++内核
  6. 界面 高炉系统_首钢京唐七大系统介绍
  7. html分页实现w3c,分页_w3cschool
  8. 2007 Office System Beta2 Technical Refresh 下载
  9. 供应商禁止供货后,这个城市行动了:社区团购不得低价倾销、排挤对手
  10. [置顶] Oracle 11.2.0.3.0 Active Data Guard 遇 ORA-10458、ORA-01152、ORA-01110 错误
  11. 解决安装YouCompleteMe与Vim版本不兼容问题
  12. 为什么自建深度学习机器?因为比AWS便宜10倍啊!
  13. 格雷码Gray Code详解
  14. Jquery WeUI 复选框
  15. Python常用中文分词库:jieba
  16. 数据库中了勒索病毒,怎么办?
  17. html刷浏览量,批量刷网页点击量工具
  18. 计算机考研专业课资料百度云,考研专业课资料(一)
  19. 阿里TPP图化框架技术实践 — 打造算法在线服务领域极致开发体验与性能
  20. JVM内存区域(Java内存区域)、JVM垃圾回收机制(GC)初探

热门文章

  1. 《Cocos2D-x权威指南》——1.2 什么是Cocos2D-x
  2. 论文降重脚本思路(根据词性)
  3. 协议(四)-通信发展史
  4. MySQL基本概念,存储引擎,数据类型
  5. 三款实用且颜值高的国内wordpress主题,免费下载
  6. 很有深意的《白雪公主杀人事件》
  7. phpStudy出现80端口被占用,占用进程为System
  8. postgresql 常用命令行
  9. linux通过java获取root权限_通过可写文件获取Linux root权限的5种方法
  10. CPU的一、二、三级缓存