您的位置:首页 > 移动开发 > Objective-C

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: