Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。
应当直接在
Object构造器对象上调用此方法,而不是在任意一个Object类型的实例上调用。
const object = {};
Object.defineProperty(object, "name", {
value: "张三",
configurable: true
});
语法
Object.defineProperty(obj, prop, descriptor)
参数
obj - 要定义属性的对象
prop - 要定义或修改的属性的名称或Symbol
descripter - 要定义或修改的属性描述符
返回值
返回被传递给函数的对象
descriptor参数解释
该参数传入一个对象
configurable
当且仅当该属性的 configurable 键值为 true 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。 默认为 false。
const object = {};
Object.defineProperty(object, "name", {
value: "张三",
configurable: true
});
console.log(object.name); //张三
delete object.name;
console.log(object.name); //undefined
设置 configurable:false 再对其赋值会报错
const object = {};
Object.defineProperty(object, "name", {
value: "张三",
configurable: false
});
//下面在赋值会报错 TypeError: Cannot redefine property: ××× (无法重新定义属性×××)
Object.defineProperty(object, "name", {
value: "李四",
});
//移除属性也不会生效
delete object.name;
console.log(object.name); //张三
enumerable
当且仅当 enumerable:true 时,该属性才会出现在对象的枚举属性中。 默认为 false。
注:可枚举可以理解为是否可以被遍历被列举出来,可枚举性决定了这个属性能否被for…in查找遍历到。可以通过object.propertyIsEnumerable('×××')判断一个属性是否是可枚举属性
const object = {
age:12
};
Object.defineProperty(object, "name", {
value: "张三",
enumerable:true
});
console.log(object.propertyIsEnumerable('name')); //true
for(var key in object){
console.log(key);
}
//输出: age name
const object = {
age:12
};
Object.defineProperty(object, "name", {
value: "张三",
enumerable:false
});
console.log(object.propertyIsEnumerable('name')); //false
for(var key in object){
console.log(key);
}
//输出: age
value
该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。 默认为 undefined。
writable
当且仅当 writable:true 时,属性的值,也就是上面的 value,才能被[赋值运算符]默认为 false。
const object = {};
Object.defineProperty(object, "name", {
value: "张三",
writable: false
});
object.name = "李四"
console.log(object.name); //张三
const object = {};
Object.defineProperty(object, "name", {
value: "张三",
writable: true
});
object.name = "李四"
console.log(object.name); //李四
get
属性的 getter 函数,如果没有 getter,则为 undefined。当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入 this 对象(由于继承关系,这里的this并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值。 默认为 [undefined]。
const object = {
name: "张三"
};
Object.defineProperty(object, "name", {
get:function(){
return '李四';
}
});
console.log(object.name); //李四
set
属性的 setter 函数,如果没有 setter,则为 undefined。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 this 对象。 默认为 [undefined]。
const object = {
name: "",
NO:""
};
Object.defineProperty(object, "NO", {
set:function(nVal){
if(nVal === "123"){
this.name = "张三"
}else if(nVal === "456"){
this.name = "李四"
}
}
});
object.NO = "123"
console.log(object.name); //张三
object.NO = "456"
console.log(object.name); //李四