242 Object.defineProperty

Object.defineProperty:设置或修改对象中的属性。

Object.defineProperty(obj, prop, descriptor)。

obj:必需,目标对象
prop:必需,需定义或修改的属性的名字
descriptor:必需,目标属性所拥有的特性
Object.defineProperty() 第三个参数 descriptor 说明:
(1)value: 设置或新增的属性的值 【默认是undefined。】

(2)writable: 值是否可以重写,true | false,默认值是false 【如果第一次设置的时候,为false,后面改为true,再设置value,会报错】

(3)enumerable: 目标属性是否可以被枚举,true | false,默认的值是 false

(4)configurable: 目标属性是否可以被删除,或是否可以再次修改特性 true | false,默认的值是 false 【第一次设置后,允许再修改第三个参数里面的特性,即不能再修改属性的enumerable、configurable】

(5)我的补充:还有get()、set()选项,但是这两个选项中的任何一个选项都不能和 value选项 同时出现,否则报错。
Object.defineProperty(对象,修改或新增的属性名,{
  value: 修改或新增的属性的值,
  writable: true / false,  // 如果值为false,不允许修改这个属性值
  enumerable: false,    // enumerable 如果值为false,则不允许遍历
  configurable: false   // 属性是否可以被删除,或是否可以再次修改特性,configurable 如果为false,则不允许删除这个属性
})	
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <script>
        // Object.defineProperty() 定义新属性或修改原有的属性
        var obj = {
            id: 1,
            pname: '华为',
            price: 1999
        };
        // 1. 以前的对象添加和修改属性的方式
        // obj.num = 1000;
        // obj.price = 99;
        // console.log(obj);


        // 2. Object.defineProperty() 定义新属性或修改原有的属性
        Object.defineProperty(obj, 'num', {
            value: 1000,
            enumerable: true
        });
        console.log(obj); // {id: 1, pname: "华为", price: 1999, num: 1000}

        Object.defineProperty(obj, 'price', {
            value: 9.9
        });
        console.log(obj); // {id: 1, pname: "华为", price: 9.9, num: 1000}

        Object.defineProperty(obj, 'id', {
            // 如果值为false 不允许修改这个属性值 默认值也是false
            writable: false,
        });
        obj.id = 2;
        console.log(obj); // (1)修改失败,因为writable: false;(2){id: 1, pname: "华为", price: 9.9, num: 1000}

        Object.defineProperty(obj, 'address', {
            value: '深圳',
            // 如果只为false 不允许修改这个属性值 默认值也是false
            writable: false,
            // enumerable 如果值为false 则不允许遍历, 默认的值是 false
            enumerable: false,
            // configurable 如果为false 则不允许删除这个属性 不允许再修改第三个参数里面的特性 默认为false
            configurable: false
        });
        console.log(obj); // {id: 1, pname: "华为", price: 9.9, num: 1000, address: "深圳"}
        console.log(Object.keys(obj)); // ["id", "pname", "price", "num"]

        delete obj.address; // 不能删除,因为configurable: false
        console.log(obj); // {id: 1, pname: "华为", price: 9.9, num: 1000, address: "深圳"}

        delete obj.pname; // 删除成功
        console.log(obj); // {id: 1, price: 9.9, num: 1000, address: "深圳"}

        Object.defineProperty(obj, 'address', {
            value: '中国山东蓝翔技校xx单元',
            // 如果只为false 不允许修改这个属性值 默认值也是false
            writable: true,
            // enumerable 如果值为false 则不允许遍历, 默认的值是 false
            enumerable: true,
            // configurable 如果为false 则不允许删除这个属性 默认为false
            configurable: true
        });
        console.log(obj.address); //
    </script>
</body>

</html>
原文地址:https://www.cnblogs.com/jianjie/p/12229142.html