es6的Object.defineproperty

1.(在f12控制台的字体颜色区别)

1.1未使用defineproperty添加属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>回顾Object.defineproperty方法</title>
</head>
<body>

    <script type="text/javascript">
        let person = {
            name:'张三',
            sex:'男',
            age:18
        }

        console.log(person);
    </script>
    
</body>
</html>

在这里插入图片描述

1.2 使用defineproperty添加属性

在这里插入图片描述

总结: 会发现,通过Object.defineproperty添加进来的属性颜色会浅些

2.是否可枚举

2.1未使用defineproperty添加属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>回顾Object.defineproperty方法</title>
</head>
<body>

    <script type="text/javascript">
        let person = {
            name:'张三',
            sex:'男',
            age:18
        }

        // Object.defineProperty(person,'age',{
        //     value:18
        // })

        console.log(Object.keys(person));
    </script>
    
</body>
</html>

在这里插入图片描述

2.2 使用defineproperty添加属性

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>回顾Object.defineproperty方法</title>
</head>
<body>

    <script type="text/javascript">
        let person = {
            name:'张三',
            sex:'男'
            // age:18
        }

        Object.defineProperty(person,'age',{
            value:18
        })

        console.log(Object.keys(person));
    </script>
    
</body>
</html>

在这里插入图片描述

总结: Object.defineproperty不可枚举,就是不可以遍历得到通过Object.defineproperty添加进来的属性

3.使用enumerable

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>回顾Object.defineproperty方法</title>
</head>
<body>

    <script type="text/javascript">
        let person = {
            name:'张三',
            sex:'男'
            // age:18
        }

        Object.defineProperty(person,'age',{
            value:18,
            enumerable:true, //控制属性是否可以枚举,默认值是false
        })

        console.log(Object.keys(person));
        console.log(person)
    </script>
    
</body>
</html>

在这里插入图片描述

总结: 会发现添加了enumerable属性后,不仅可以枚举了,颜色也变深了。

但是会发现一个问题,就是无法修改

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>回顾Object.defineproperty方法</title>
</head>
<body>

    <script type="text/javascript">
        let person = {
            name:'张三',
            sex:'男'
            // age:18
        }

        Object.defineProperty(person,'age',{
            value:18,
            enumerable:true, //控制属性是否可以枚举,默认值是false
        })

        console.log(Object.keys(person));
        console.log(person)
        person.age = 19;
        console.log(person)
    </script>
    
</body>
</html>

在这里插入图片描述

不是用Object.defineproperty的是可以修改的

在这里插入图片描述

4.使用writable

在这里插入图片描述

5.使用configurable

正常情况下,是可以任意删除属性的

在这里插入图片描述

使用Object.defineproperty的
在这里插入图片描述

添加configurable属性的
在这里插入图片描述

6.使用get函数

有个场景:如下代码,我想在控制台上让其number修改后,person.age也跟着改变

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>回顾Object.defineproperty方法</title>
</head>
<body>

    <script type="text/javascript">
        let number = 18;
        let person = {
            name:'张三',
            sex:'男',
            age:number
        }

        // Object.defineProperty(person,'age',{
        //     value:18,
        //     enumerable:true, //控制属性是否可以枚举,默认值是false
        //     writable:true, //控制属性是否可以被修改,默认值是false
        //     configurable:true //控制属性是否可以被删除,默认值是false
        // })

        console.log(person);
    </script>
    
</body>
</html>

在这里插入图片描述

解决方案:使用Object.defineproperty里的get函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>回顾Object.defineproperty方法</title>
</head>
<body>

    <script type="text/javascript">
        let number = 18;
        let person = {
            name:'张三',
            sex:'男',
            // age:number
        }

        Object.defineProperty(person,'age',{
            // value:18,
            // enumerable:true, //控制属性是否可以枚举,默认值是false
            // writable:true, //控制属性是否可以被修改,默认值是false
            // configurable:true //控制属性是否可以被删除,默认值是false

            // 当有人读取person的age属性时,get函数就会被调用,且返回值就是age的值
            get:function(){
                return number;
            }
        })

        console.log(person);
    </script>
    
</body>
</html>

在这里插入图片描述

会发现有个 get age:f() 刚好对应get函数对应的age属性

7.使用set函数

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>回顾Object.defineproperty方法</title>
</head>
<body>

    <script type="text/javascript">
        let number = 18;
        let person = {
            name:'张三',
            sex:'男',
            // age:number
        }

        Object.defineProperty(person,'age',{
            // value:18,
            // enumerable:true, //控制属性是否可以枚举,默认值是false
            // writable:true, //控制属性是否可以被修改,默认值是false
            // configurable:true //控制属性是否可以被删除,默认值是false

            // 当有人读取person的age属性时,get函数(getter)就会被调用,且返回值就是age的值
            get:function(){
                return number;
            },

            // 当有人修改person的age属性时,set函数(setter)就会被调用,且会受到修改的具体指
            set(value){
                console.log('有人修改了age属性,且值是',value);
            }
        })

        console.log(person);
    </script>
    
</body>
</html>

在这里插入图片描述

会发现person的age并没有发生变化,因为get函数会返回age的值,而get函数return的是number这个变量,如果需要修改,则在set函数中添加number=value;

在这里插入图片描述

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值