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
本文详细介绍了JavaScript中Object.defineProperty方法的使用,包括方法原型、参数解释、返回值及异常情况。通过示例代码展示了如何修改和添加对象属性,以及如何通过Object.defineProperty设置属性的特性,如可配置性、可枚举性、可重写性等。
884

被折叠的 条评论
为什么被折叠?



