美文网首页
js--Object.defineProperty()详解

js--Object.defineProperty()详解

作者: 花拾superzay | 来源:发表于2020-01-13 18:22 被阅读0次

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

语法

Object.defineProperty(obj, prop, descriptor)。

obj:是要在其上定义属性的对象(类型object)。
prop:是要定义或修改的属性的名称(类型string)。
descriptor:用于定义属性的性质(类型object)。

第三个参数 descriptor 介绍

descriptor用来定义(或者说描述)属性的性质,比如是否可读写,是否可删除,是否可枚举,以及属性的性质是否可以重新定义等等。

descriptor对象可以有configurable,enumerable,value,writable四个属性;以及get,set两个函数(访问器)。在descriptor对象中避免(value或writable)和(get或set)同时出现,会抛出异常。

数据型属性,访问器型属性
数据型属性:使用configurable,enumerable,writable,value定义的属性。
访问器型属性:使用configurable,enumerable,get,set定义的属性。

如果首次定义属性且使用Obeject.defineProperty()方法,descriptor对象没有value,writable,get 和 set 任意一个,认为其定义的是数据型属性。

configurable
当且仅当 configurable 为 true 时,才可以使用Object.defineProperty()重新定义属性的 enumerable,writable,get,set,以及configurable自身五个性质。同时属性也才能从对应的对象上被删除。

有一个列外,当属性的configurable为false时,如果属性的writable为true,那么该属性的writable可以重新定义为false

默认值为 false。当使用Object.defineProperty()定义属性时,如果属性当前没有生效的configurable设置,且descriptor对象没有配置configurable,则取默认值。反之如果属性当前已有生效的configurable,此时descriptor对象缺省configurable,则不设置保持原值。像 let a={p:10} 或者 let a={};a.p=10 这样初次定义属性时,属性p的configurable为true。

enumerable
表示该属性是否可枚举,即是否通过for-in循环或Object.keys()返回属性。

默认值为 false。当使用Object.defineProperty()定义属性时,如果属性当前没有生效的enumerable设置,且descriptor对象没有配置enumerable,则取默认值。反之如果属性当前已有生效的configurable,此时descriptor对象缺省enumberable,则不设置保持原值。像 let a={p:10} 或者 let a={};a.p=10 这样初次定义属性时,属性p的enumerable为true。

writable
能否修改属性的值,即常量属性。

如果属性从数据型,变成访问器型,则writable性质失效。

默认值为 false。当使用Object.defineProperty()定义属性时,如果属性当前没有生效的writable设置,且descriptor对象没有配置writable,则取默认值。反之如果属性当前已有生效的writable,此时descriptor对象缺省writable,则不设置保持原值。像 let a={p:10} 或者 let a={};a.p=10 这样初次定义属性时,属性p的writable为true。

value
该属性对应的值。

如果属性从数据型,变成访问器型,则value性质失效。

默认值为 undefined。当使用Object.defineProperty()定义属性时,如果属性当前没有生效的value设置,且descriptor对象没有配置value,则取默认值。反之如果属性当前已有生效的value,此时descriptor对象缺省value,则不设置保持原值。

get
get是一个函数,读取属性值时调用的函数。当读取属性值时,如果get为undefined则返回undefined。如果get为函数,则调用函数,调用没有参数传入,函数的this与常规的函数this一致。get函数的返回值即为读取到的值。

如果属性从访问器型,变成数据型,则get性质失效

默认值 undefined。当使用Object.defineProperty()定义属性时,如果属性当前没有生效的get设置,且descriptor对象没有配置get,则取默认值。反之如果属性当前已有生效的get,此时descriptor对象缺省get,则不设置保持原值。

set
set是一个函数,给属性赋值时调用的函数。当属性赋值时,如果set为undefined则什么都不做。如果set为函数,则调用函数,所赋的值传入函数,函数的this与常规的函数this一致。然后执行set函数。

如果属性从访问器型,变成数据型,则set性质失效

默认值 undefined。当使用Object.defineProperty()定义属性时,如果属性当前没有生效的set设置,且descriptor对象没有配置set,则取默认值。反之如果属性当前已有生效的set,此时descriptor对象缺省set,则不设置保持原值。

对象字面量定义属性

像 let a={p:10}定义对象, 或者 let a={};a.p=10 这样初次定义属性时,属性的类型是数据型,且configurable为true,enumerable为true,writable为true

相关文章

网友评论

      本文标题:js--Object.defineProperty()详解

      本文链接:https://www.haomeiwen.com/subject/izzgactx.html