Object.defineProperty
2015-12-07 10:50
615 查看
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
相关文章推荐
- 多线程操作之NSObject
- 圣思园java se培训总结(28-32)(Object类,String类,包装类,数组)
- Class.isAssignableFrom(Class clz)与instanceof与Class.isInstance(Object obj) 的区别和联系
- 2015.12.7 Objective-c CoreGraphic
- Java中关于先有鸡还是先有蛋的问题----Class&Object
- 【Objective-C学习记录】第五天
- OC-随便看看
- 转载:Objective-C中的 instancetype 和 id 关键字
- Objective-C消息模式
- Objective-C:运行时runtime
- Conclusion for Inheritance and Object Oriented Design
- runtime理解
- Objective-C初学者速查表
- Objective-C 零散知识笔记 by STP
- 函数对象(function object)的简单讲解
- 【Objective-C学习记录】第四天
- Objective-c中的面向对象
- 【Objective-C学习记录】第三天
- READING NOTE: Object Detection by Labeling Superpixels
- ios开发——Objective-c的SHA224/SHA256/SHA384/SHA512加密算法的实现