当前位置 博文首页 > 纸飞机博客:object.defineProperty
Object.defineProperty()?方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回这个对象。
Object.defineProperty(obj,prop,descriptor)
obj:必需。目标对象
prop:必需。需定义或修改的属性的名字
descriptor:必需。属性描述符。内部值。
返回:传入函数的对象。即第一个参数obj
Object.getOwnPropertyDescriptor(obj,prop) 查看属性的描述符
?属性描述符:属性的各种特征。
configurable:属性是否可以通过delete 被删除。或特性是否能修改。
enumerable:属性是否可以被for..in或 Object, keys 遍历。
writable:属性的数据值是否可以修改。
value:属性的数据值。读取和写入属性值 时的存放位置。默认值为undefined。
get:当读取属性时调用的方法。默认值为 undefined。
set:当写入属性时调用的方法。默认值为 undefined。
1 .数据属性
包含数据值,其描述符有configurable, enumerable,writable,value 四个。
//可在对象上直接定义数据属性或修改其数据值。其configurable, enumerable, writable默认值为true。但修改其他属性特性需用defineProperty。
var obj = {};
obj.a = 1;
obj.a = 2;//修改值
console.log(
Object.getOwnPropertyDescriptor(obj, "a"));
//{configurable: true,enumerable: true,value: 2,writable: true,__proto__: Object}
//修改其writable为不可改写
Object.defineProperty(obj,"a",{
writable: false
})
console.log(obj.a); // 2
obj.a = 3
console.log(obj.a);//2 仍然是2,所以改写不成功
也可通过defineProperty定义数据属性。其configurable, enumerable, writable不设置默认值为false。
Object.defineProperty(obj, "b",{
value: 1
});
console.log(Object.getOwnPropertyDescriptor(obj, "b"));
//{configurable: false,enumerable: false,value: 1,writable: false,__proto__: Object}
obj.b = 2
console.log(obj.b) // 1 (writable为false无法改写)
Object.defineProperty(obj, "b", {
writable: true
})
// Uncaught TypeError: Cannot redefine property: b (报错,configurable为false,无法重新修改特性)
2 .访问器属性
不包含数据值。描述符有configurable, enumerable,get,set四个,不能再同时拥 有writable 或 value。
无法直接在对象上定义,需通过defineProperty 设置 configurable ,enumerable 默认为 false
var user = {
name: 'xiao'
};
var count = 12;
//定义访问器属性age
Object.defineProperty(user,age,{
get: function(){
return count;
},
set: function(newVal){
count = newVal + 1;
}
})
console.log(user.age); //12 (意为调用get)
user.age = 42;//(意为调用set)
console.log(user.age); //43
console.log(Object.getOwnPropertyDescriptor(user, "age"));
//{ I
configurable: false
enumerable: false
get: f()
set: f(newVal)
__proto__: Object
}
属性必须为数据属性或访问器属性之一,不能同时是两者。writable/value是数据属性的描符,get/set是访问器属性的描述符,无法同时设置。
Object.defineProperty(user,like,{
value: 'eat',
get: function() {
return 1;
)
});
// Uncaught TypeError: Invalid property descriptor.Cannot both specify accessors and a value or writable attribute
-------------
user.height = 174 // 数据属性
console.log(Object.getOwnPropertyDescriptor(user, "height"));
//{
configurable: true,
enumerable: true,
value: 174,
writable: true,
__proto__: Object
}
//设置get描述符后,value值没了,成为访问器属性
Object.defineProperty(user,height,{
get: function() { i
return 1;
}
}) I
console.log(Object.getOwnPropertyDescriptor(user, "height"));
{
configurable: true
enumerable: true
get: f ()
set: undefined
__proto__: Object
}
cs