- 什么是Object.defineProperty()?
Object.defineProperty()方法会直接在一个对象上定义一个新属性,或修改一个对象的现有属性,并返回对象。
注意:应当直接在 Object 构造器对象上调用此方法,而不是在任意一个 Object 类型的实例上调用。
var object = {
};
Object.defineProperty(object,'name',{
value:'lh',
writable:false
});
Object.name = 'zs';
console.log(object.name);//结果还为lh
- Object.defineProperty()的内置参数有哪些?
Object.defineProperty(obj, prop, descriptor)
obj:要定义属性的对象。
prop:要定义或修改的属性的名称或 Symbol 。
descriptor:要定义或修改的属性描述符。
返回值是传递给参数的对象
- 有哪些可选键值?
该方法允许精确地添加或修改对象的属性。通过赋值操作添加的普通属性是可枚举的,在枚举对象属性时会被枚举到(for…in 或 Object.keys 方法),可以改变这些属性的值,也可以删除这些属性。
configurable
当且仅当该属性的 configurable 键值为 true 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。
默认为 false。
enumerable
当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。
默认为 false。
数据描述符还具有以下可选键值:
value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。
默认为 undefined。
writable
当且仅当该属性的 writable 键值为 true 时,属性的值,也就是上面的 value,才能被赋值运算符改变。
默认为 false。
- 创建属性
如果对象中不存在指定的属性,Object.defineProperty() 会创建这个属性。当描述符中省略某些字段时,这些字段将使用它们的默认值。
var object = {
}; // 创建一个新对象
// 在对象中添加一个属性与数据描述符的示例
Object.defineProperty(object, "a", {
value : 37,
writable : true,
enumerable : true,
configurable : true
});
// 对象 object 拥有了属性 a,值为 37
// 在对象中添加一个设置了存取描述符属性的示例
var bValue = 38;
Object.defineProperty(object, "b", {
// 使用了方法名称缩写(ES2015 特性)
// 下面两个缩写等价于:
// get : function() { return bValue; },
// set : function(newValue) { bValue = newValue; },
get() {
return bValue; },
set(newValue) {
bValue = newValue; },
enumerable : true,
configurable : true
});
object.b; // 38
// 对象 object 拥有了属性 b,值为 38
// 现在,除非重新定义 object.b,object.b 的值总是与 bValue 相同
// 数据描述符和存取描述符不能混合使用
Object.defineProperty(object, "conflict", {
value: 0x9f91102,
get() {
return 0xdeadbeef; }
});