Table of Contents
- Table of Contents
- Object.preventExtension
- Object.seal
- Object.freeze
- Object.defineProperty
- for…in
- hasOwnProperty
Object.preventExtension
该方法将对象标记为不可扩展,阻止添加自身的属性,但不可扩展对象的属性仍然可被删除、修改,也可以添加到对象原型,尝试将新属性添加到不可扩展对象将静默失败或抛出
TypeError,一旦使其不可扩展,就无法再对象进行扩展。
1 | /** |
Object.isExtensible
默认情况下,对象是可扩展的:即可以为他们添加新的属性。以及它们的
__proto__属性可以被更改。Object.preventExtensions、Object.seal或Object.freeze方法都可以标记一个对象为不可扩展(non-extensible)
1 | /** |
注:虽然 Object.freeze 或 Object.seal 之后的对象是不可扩展的,但使用 Object.isExtensible 判断返回 false
Object.seal
密封一个对象,使对象不可扩展,且所有自身属性都不可配置、不可删除(但不一定是不可写)的对象
1 | /** |
给对象设置,
Object.preventExtension(obj),
禁止更改原型,禁止添加属性为对象的每一个属性设置,
configurable:false,
禁止更改属性值
与 Object.freeze 不同的是,Object.seal 后的对象是可写的 writable:true,可以改变其现有属性
Object.isSealed
1 | /** |
Object.freeze
冻结一个对象,冻结指的是不能向这个对象添加新的属性,不能修改其已有属性的值,不能删除已有属性,以及不能修改该对象已有属性的可枚举性、可配置性、可写性。该方法返回被冻结的对象。
1 | /** |
给对象设置,
Object.preventExtension(obj)禁止更改原型,禁止添加属性为对象的每一个属性设置,
writable:false禁止更改属性值为对象的每一个属性设置,
configurable:false禁止删除属性
注:禁止添加属性,是 Object.preventExtensions 控制的,而禁止删除属性,是 configuable:false 控制的。用 Object.seal() 密封的对象可以改变它们现有的属性,使用 Object.freeze() 冻结的对象中现有属性是不可变的。
Object.isFrozen
一个对象是冻结的是指它不可扩展,所有属性都是不可配置的,且所有数据属性(即没有
getter或setter组件的访问器的属性)都是不可写的。
1 | /** |
Object.defineProperty
1 | /** |
descriptor
对象里目前存在的属性描述符有两种主要形式:数据描述符 和 存取描述符。数据描述符 是一个具有值的属性,该值可能是可写的,也可能不是可写的。存取描述符 是由 getter-setter 函数对描述的属性。描述符必须是这两种形式之一;不能同时是两者。
数据描述符和存取描述符均具有以下可选键值:
configurable
当且仅当该属性的 configurable 为
true时,该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。默认为falseenumerable
当且仅当该属性的 enumerable 为 true 时,该属性才能够出现在对象的枚举属性中。默认为
false
数据描述符同时具有以下可选键值:
value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。默认为
undefinedwritable
当且仅当该属性的 writable 为 true 时,value 才能被赋值运算符改变。默认为
false
存取描述符同时具有以下可选键值:
get
一个给属性提供 getter 的方法,如果没有 getter 则为
undefined。当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)默认为
undefinedset
一个给属性提供 setter 的方法,如果没有 setter 则为
undefined。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值默认为
undefined
keys
| configurable | enumerable | value | writable | get | set | |
|---|---|---|---|---|---|---|
| 数据描述符 | Yes | Yes | Yes | Yes | No | No |
| 存取描述符 | Yes | Yes | No | No | Yes | Yes |
如果一个描述符不具有
value,writable,get和set任意一个关键字,那么它将被认为是一个数据描述符。如果一个描述符同时有(value或writable)和(get或set)关键字,将会产生一个异常。
for…in
for...in语句以任意顺序遍历一个对象的可枚举属性
for...in 也会遍历原型链上的可枚举属性,可以通过 Object.hasOwnProperty 方法判断是否自身属性
hasOwnProperty
所有继承了 Object 的对象都会继承到 hasOwnProperty 方法。这个方法可以用来检测一个对象是否含有特定的自身属性
1 | const o = {} |
防止方法被重写,使用 Object.prototype 上的方法定义一个工具函数
1 | function hasOwn(target, key) { |
注:和 in 运算符不同,该方法会忽略掉那些从原型链上继承到的属性