一, 定义
无序属性的集合(散列表), 其属性可以包含基本值, 对象或函数;
每个对象都是基于一个引用类型创建的, 这个引用类型可以是原生类型, 也可以是自定义类型.
二, 创建对象
创建一个 Object 实例
image
对象字面量
image
其中 name 和 age 是 person 的属性, sayName 是 person 的方法.
三, 属性类型
只有内部才用的特性, 在 JS 中不能直接访问它们, 为了表示特性是内部值, 把它们放到了 [[]] 中;
ECMAScript 中有以下两种属性: 数据属性和访问器属性.
image
数据属性
其中, person.name 的 [Configurable]],[[Enumerable]],[[Writable]] 都为 true,[[Value]]为 Memory.
修改数据属性: Object.defineProperty(对象 obj, [属性名称], 描述符对象)
其中, 描述符对象的属性必须是 configurable,enumerable,writable,value 之内的一到四个.
image
在调用 Object.defineProperty 时, 如果不指定, configurable,enumerable,writable 的值都默认为 false;
在把 configurable 设为 false 之前, 可以多次调用 Object.defineProperty()修改同一个属性. 之后修改除 writable 之外的其他特性, 都会导致错误;
尝试修改 writable:
image
尝试修改 configurable:
image
configurable 设为 false, 即表示不能从对象中删除属性;
如果这个对象调用 delete, 非严格模式下会被忽略, 严格模式下则会抛错.
writable 设为 false, 即表示该属性不可写;
非严格模式下会被忽略, 严格模式下则会抛错.
image
访问器属性
访问器属性包含 getter 和 setter 函数(这两个函数都不是必需的), 其中 setter 用来写值, getter 用来读值.
设置一个属性的值会导致其他属性的变化, 如下例 year 的变化导致_year 和 age 的变化:
image
不一定非要指定 getter 和 setter;
只指定 getter 意味着属性只能读不能写;
尝试写入, 在非严格模式下会被忽略, 严格模式下则会抛错.
只指定 setter 意味着属性只能读不能读;
尝试读取, 在非严格模式下会返回 undefined, 严格模式下则会抛错.
在该方法之前, 要创建访问器属性一般要使用两个非标准的方法: defineGetter() 和 defineSetter()
image
不支持 Object.defineProperty()的浏览器不能修改 [Configurable]] 和[[Enumerable]]
四, 定义多个属性
Object.defineProperties(对象 obj, 对象 其属性为 obj 要添加和修改的属性)
五, 读取属性的特性
Object.getOwnPropertyDescriptor(对象, 属性)
参考
《JavaScript 高级程序设计》
image
六, 结语
本文主要介绍了对象属性的各种特性. 其主要包括数据属性的 [[Configurable]],[[Enumerable]],[[Writable]],[[Value]] 和访问器属性的[[Configurable]],[[Enumerable]],[[Get]],[[Set]].
自己整理了一份 2019 最全面前端学习资料, 从最基础的 html+CSS+JS 到移动端 HTML5 到各种框架都有整理, 送给每一位前端小伙伴, 这里是小白聚集地, 欢迎初学和进阶中的小伙伴
如有问题, 欢迎指正.
image
来源: http://www.jianshu.com/p/bb29f69d9c35