JS中 Object.defineProperty() 方法的使用

JS中 Object.defineProperty() 方法的使用

Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性,并返回此对象。

备注:应当直接在 Object 构造器对象上调用此方法,而不是在任意一个 Object 类型的实例上调用。

使用语法:

Object.defineProperty(obj, prop, descriptor)

//参数说明:
//obj :要修改属性或者定义属性的那个目标对象 
//prop :要定义或修改的属性的名称或 Symbol 。
//descriptor: 要定义或修改的属性描述符。。

//返回值:
//被修改后的目标对象

//举个栗子
let myobj = {
    
    
    name: '小肉包',
    age: 25
}
Object.defineProperty(myobj, 'sex', {
    
    
    value: '女'
})
console.log(myobj); // => {name: "小肉包", age: 25, sex: "女"}

注意:

该方法允许精确地添加或修改对象的属性。通过赋值操作添加的普通属性是可枚举的,在枚举对象属性时会被枚举到(for…in 或 Object.keys 方法),可以改变这些属性的值,也可以删除这些属性。这个方法允许修改默认的额外选项(或配置)。默认情况下,使用 Object.defineProperty() 添加的属性值是不可修改(immutable)的。

参数 descriptor是一个对象,除了有value属性之外,还有一下属性:

  1. configurable
    当且仅当该属性的 configurable 键值为 true 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。
    默认为 false
//这个属性起到两个作用:
// 1.目标属性是否可以使用delete删除
// 2.目标属性是否可以再次设置特性

//-----------------测试目标属性是否能被删除------------------------
var obj = {
    
    }
//第一种情况:configurable设置为false,不能被删除。
Object.defineProperty(obj,"newKey",{
    
    
    value:"hello",
    writable:false,
    enumerable:false,
    configurable:false
});
//删除属性
delete obj.newKey;
console.log( obj.newKey ); //hello

//第二种情况:configurable设置为true,可以被删除。
Object.defineProperty(obj,"newKey",{
    
    
    value:"hello",
    writable:false,
    enumerable:false,
    configurable:true
});
//删除属性
delete obj.newKey;
console.log( obj.newKey ); //undefined

//-----------------测试是否可以再次修改特性------------------------
var obj = {
    
    }
//第一种情况:configurable设置为false,不能再次修改特性。
Object.defineProperty(obj,"newKey",{
    
    
    value:"hello",
    writable:false,
    enumerable:false,
    configurable:false
});

//重新修改特性
Object.defineProperty(obj,"newKey",{
    
    
    value:"hello",
    writable:true,
    enumerable:true,
    configurable:true
});
console.log( obj.newKey ); //报错:Uncaught TypeError: Cannot redefine property: newKey

//第二种情况:configurable设置为true,可以再次修改特性。
Object.defineProperty(obj,"newKey",{
    
    
    value:"hello",
    writable:false,
    enumerable:false,
    configurable:true
});

//重新修改特性
Object.defineProperty(obj,"newKey",{
    
    
    value:"hello",
    writable:true,
    enumerable:true,
    configurable:true
});
console.log( obj.newKey ); //hello
  1. enumerable
    当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。
    默认为 false
var obj = {
    
    }
//第一种情况:enumerable设置为false,不能被枚举。
Object.defineProperty(obj,"newKey",{
    
    
    value:"hello",
    writable:false,
    enumerable:false
});

//枚举对象的属性
for( var attr in obj ){
    
    
    console.log( attr );  
}
//第二种情况:enumerable设置为true,可以被枚举。
Object.defineProperty(obj,"newKey",{
    
    
    value:"hello",
    writable:false,
    enumerable:true
});

//枚举对象的属性
for( var attr in obj ){
    
    
    console.log( attr );  //newKey
}
  1. writable
    当且仅当该属性的 writable 键值为 true 时,属性的值,也就是上面的 value,才能被赋值运算符改变。
    默认为false
//属性的值是否可以被重写。设置为true可以被重写;设置为false,不能被重写。默认为false。

var obj = {
    
    }
//第一种情况:writable设置为false,不能重写。
Object.defineProperty(obj,"newKey",{
    
    
    value:"hello",
    writable:false
});
//更改newKey的值
obj.newKey = "change value";
console.log( obj.newKey );  //hello

//第二种情况:writable设置为true,可以重写
Object.defineProperty(obj,"newKey",{
    
    
    value:"hello",
    writable:true
});
//更改newKey的值
obj.newKey = "change value";
  1. getset
    当使用存取器描述属性的特性的时候,允许设置以下特性属性:
var obj = {
    
    };
Object.defineProperty(obj,"newKey",{
    
    
    get:function (){
    
    } | undefined,
    set:function (value){
    
    } | undefined
    configurable: true | false
    enumerable: true | false
});

注意:当使用了getter或setter方法,不允许使用writable和value这两个属性

getter/setter
当设置或获取对象的某个属性的值的时候,可以提供getter/setter方法。

  • getter 是一种获得属性值的方法
  • setter是一种设置属性值的方法。

在特性中使用get/set属性来定义对应的方法。

var obj = {
    
    };
var initValue = 'hello';
Object.defineProperty(obj,"newKey",{
    
    
    get:function (){
    
    
        //当获取值的时候触发的函数
        return initValue;    
    },
    set:function (value){
    
    
        //当设置值的时候触发的函数,设置的新值通过参数value拿到
        initValue = value;
    }
});
//获取值
console.log( obj.newKey );  //hello

//设置值
obj.newKey = 'change value';

console.log( obj.newKey ); //change value

详情见MDN文档介绍

猜你喜欢

转载自blog.csdn.net/weixin_47160442/article/details/112968213