ES5的Object.defineProperty详解

  1. Object.defineProperty()

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

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

语法
Object.defineProperty(obj,prop,descriptor)

obj:必需 目标对象
prop:必需 需定义或修改的属性的名字
descriptor:必需 目标属性所拥有的特性(以对象{}的格式书写)(有四个属性值)
value:设置属性值,默认是undefined
writable:属性值是否可以被修改,true|false(true是可以被修改,false是不可以被修改,默认值是false)
enumerable:目标属性是否可以被枚举(遍历),true|false(true是可以被遍历出来(可以被枚举枚举),false则是不可以呗遍历出来(不可被枚举)(默认值是false)
configurable:目标属性是否可以被删除或者是否可以再次修改特性,true|false(如果是false则不允许删除这个属性,如果为true则可以删除这个属性)(默认值是false)(不允许修改第三个参数里面的特性)
let obj = {
    id: 1,
    name: '小米',
    price: 1999
};
// 以前对象添加和修改属性的方式
obj.num = 1000;
obj.price = 99;
console.log(obj);

// Object.definePrototype()定义对象中新属性或修改原有属性
// 添加方法
Object.definePrototype(obj, 'num',{
    value: 1000
});
console.log(obj);

// 修改方法
Object.definePrototype(obj, 'price',{
    value: 99
});
console.log(obj);

// 设置不能修改的属性值
Object.definePrototype(obj, 'id',{
    // 不允许修改这个属性值
    writable: false
});
obj.id = 3;
console.log(obj); //=>不能修改这个属性值,如果是true就可以修改

// 设置属性名是否可以被枚举
Object.definePrototype(obj, 'address',{
    value: '火星',
    writable: false,
    enumerable: false, //=>不可被枚举(不会被遍历出来)
    configurable: false //=>不可被删除
});
console.log(obj);
console.log(Object.keys(obj)); //=>num也在这个对象中,也有一个enumerable属性,属性值默认是false
delete obj.address;
console.log(obj); //=>没有被删除
delete obj.name;
console.log(obj); //=>name被删除了

参考网站:
https://blog.csdn.net/m0_65335111/article/details/125958954
https://www.jianshu.com/p/4a86957b9337

你可能感兴趣的:(js,javascript,前端,vue.js)