Object.defineProperty
2018-09-01 05:48:58来源:博客园 阅读 ()
Object.defineProperty()方法俗称属性拦截器,会直接在一个对象上定义一个新的属性,或修改一个对象现有的属性,并返回这个对象。
语法
Object.defineProperty(obj, prop, descriptor)
参数
obj:要在其上定义的对象
prop:要定义或修改的属性的名称
descriptor:将被定义或修改的属性描述符
返回值
被传递给函数的对象
var o = { values: 'hello' } Object.defineProperty(o, 'key', { value: 9, writable: true, enumerable: true, configurable: true }); console.log(o.key) // 输出结果:9 console.log(o.values) // 输出结果:hello Object.defineProperty(o, 'values', { value: 'hello world', writable: true, enumerable: true, configurable: true }); console.log(o.values) // 输出结果:hello world
属性描述符
对象里目前存在的属性描述符有两种主要形式:数据描述符和存取描述符
数据描述符:一个具有值得属性,该值可能是可写的,也可能不是可写的。
存取描述符:由getter和setter函数描述的属性。
描述符必须是两者其一,不能同时是两者。
数据描述符
configurable
dang当且仅当该属性的configurable 为true时,该属性描述符才能够被改变,同时该属性也能从对应的对象上删除。默认为false。
enumerable
当且仅当该属性为true时,该属性才能够出现在对象的枚举属性中。默认为false。
value
该属性对应的值可以使任何有效的JavaScript值。默认为undefined
writable
当该属性为true时,value才能被赋值运算符改变。默认为false。
var o = { values: 'hello' } Object.defineProperty(o, 'values', { writable: false, // writable: false 赋值运算无法改变属性的值 enumerable: false, configurable: true }); console.log(o.values) // 结果:hello o.values = 10; console.log(o.values) // 结果:hello // enumerable: true 输出结果:values // enumerable: false 无输出 for(let key of Object.keys(o)){ console.log(key) }
var o = { values: 'hello' } Object.defineProperty(o, 'values', { writable: true, enumerable: true, configurable: false }); o.a = 1; console.log(o) // { values: 'hello', a: 1 } delete o.a console.log(o) // { values: 'hello' } delete o.values console.log(o) // { values: 'hello' }
存取描述符
存取描述符除了含有以上enumerable和configurable之外还有以下可选键值。
get
给一个属性提供getter的方法,如果没有getter则为undefined。当该属性被访问时,该方法会被执行,该方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是该属性的对象)。默认为undefined。
set
一个给属性提供 setter 的方法,如果没有 setter 则为 undefined
。当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。默认为undefined。
描述符可同时具有的属性
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关键字,将会产生异常
var o = { values: 'hello' } Object.defineProperty(o, 'values', { writable: true, enumerable: true, configurable: true, set(newval){ o = newval } }); o.values = 100; console.log(o)
mdn文档
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty#Parameters
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:vue知识掌握(一)
- 深入了解Object.defineProperty 2018-09-29
- js中Object.defineProperty()和defineProperties() 2018-06-24
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash