Object.defineProperty 红太狼 2022-08-18 02:48 16阅读 0赞 ## Object.defineProperty方法 ## ### 方法原型 ### Object.defineProperty 提供一种直接的方式来定义对象属性或者修改已有对象属性,方法原型如下: Object.defineProperty(obj,prop,descriptor) ### 参数 ### obj:必须,要在其上添加或修改属性的对象。 prop:必须,待修改的属性名称 descriptor: 待修改属性的相关描述 descriptor 要求传入一个对象,其默认值如下: { configurable: false, enumerable: false, writable: false, value: null, set: undefined, get: undefined } configurable: 属性是否可配置。可配置的含义包括:是否可以删除属性( delete ),是否可以修改属性的 writable 、 enumerable 、 configurable 属性。 enumerable: 属性是否可枚举。可枚举的含义包括:是否可以通过 for...in 遍历到,是否可以通过 Object.keys() 方法获取属性名称。 writable: 属性是否可重写。可重写的含义包括:是否可以对属性进行重新赋值。 value: 属性的默认值。 set: 属性的重写器(暂且这么叫)。一旦属性被重新赋值,此方法被自动调用。 get: 属性的读取器(暂且这么叫)。一旦属性被访问读取,此方法被自动调用。 ### 返回值 ### 已修改的对象 ### 备注 ### Object.defineProperty函数可执行的操作包括如下: 当对象不具有指定的属性名称时,向对象添加新属性。 当对象具有指定的属性名称时,修改现有的属性。 如果要同时修改多个属性,则可以用Object.defineProperties。 ### 异常情况 ### ### obj参数不是对象。 ### #### 此对象不可扩展且属性名称不存在 (Object.preventExtensions,Object.seal,Object.freeze可阻止对象的扩展)。 #### #### descriptor 具有 value 或 writable 特性,并且具有 get 或 set 特性。 #### #### descriptor 具有 get 或 set 特性,上述特性不是函数且已定义。 #### ### 示例代码 ### 列出对象属性 var names = Object.getOwnPropertyNames(obj); for (var i = 0; i < names.length; i++) { var prop = names[i]; document.write(prop + ': ' + obj[prop]); document.write(newLine); } 列出对象属性的特性 var descriptor = Object.getOwnPropertyDescriptor(obj, "name"); for (var prop in descriptor) { document.write(prop + ': ' + descriptor[prop]); document.write(newLine); } Object.defineProperty() 方法设置属性时,属性不能同时声明访问器属性( set 和 get )和 writable 或者 value 属性。 意思就是,某个属性设置了 writable 或者 value 属性,那么这个属性就不能声明 get 和 set 了,反之亦然。 var o = {}, myName = 'erik'; Object.defineProperty(o, 'name', { value: myName, set: function(name) { myName = name; }, get: function() { return myName; } }); 这种情况下,会报错 Uncaught TypeError: Invalid property. A property cannot both have accessors and be writable or have a value, \#<Object>(…) 修改 DOM 元素上的属性 var descriptor = Object.getOwnPropertyDescriptor(Element.prototype, "querySelector"); descriptor.value = "query"; descriptor.writable = false; Object.defineProperty(Element.prototype, "querySelector", descriptor); var elem = document.getElementById("div"); elem.querySelector = "anotherQuery"; document.write(elem.querySelector); 输出为query
还没有评论,来说两句吧...