Js中的对象方法

本文深入探讨了JavaScript中使用Object.defineProperty()和Object.defineProperties()来增强对象属性的安全性,包括如何设置只读、禁止删除及不可枚举的属性,以及如何实现属性值的有效范围检查。

这里有一个对象

var student = {
           name : 'zizi',
           age : 16,
           hobbly : 'sleep'
       };
console.log(student)
/*{name: "zizi", age: 16, hobbly: "sleep"}
  age: 16
  hobbly: "sleep"
  name: "zizi"
  __proto__: Object*/

对象性进行操作:
在这里插入图片描述
这么操作是很方便,可是这样不都是谁都可以对你的对象进行操作,安全性一点也能不高,所以——— Object.defineProperty() 来了。

Object.defineProperty() 的参数
Object.defineProperty 有三个参数 (object,propName,descriptor)

  1. object 对象,对哪个对象进行操作
  2. propName 属性名,操作的属性名
  3. descriptor 属性描述,属性的样式特征

descriptor 数据属性 属性特征:

  1. Configurable
    表示能否通过delete删除此属性,能否修改属性的特性,或能否修改把属性修改为访问器属性,如果直接使用字面量定义对象,默认值为true

  2. Enumerable
    表示该属性是否可枚举,即是否通过for-in循环或Object.keys()返回属性,如果直接使用字面量定义 对象,默认值为true

  3. Writable 能否修改属性的值,如果直接使用字面量定义对象,默认值为true

  4. Value 该属性对应的值,默认为undefined

对象进行操作:

var student = {
  sname : "Zizi",
  sId : 19,
  sAge : 16
};
//给对象增加一个 score属性
Object.defineProperty(Zizi,'score',{
            value : 60,
            writable : true
        });
/*
sAge: 16
sId: 19
sname: "Zizi"
score: 60
*/

上面只是对一个属性值进行操作,当要对数个属性进行操作时
如果是这样:

var Zizi = {
            sname : "Zizi",
            sId : 19,
            sAge : 16,
            salary : 100000
        }
        Object.defineProperty(Zizi,'score',{
            value : 60,
            writable : true
        });
        //id 不可删除
        Object.defineProperty(Zizi,'sId',{
            configurable : false,
        });
        //姓名不可删除
        Object.defineProperty(Zizi,'sname',{
            configurable : false,
        });
        //工资不可枚举
        Object.defineProperty(salary,'sname',{
            enumerable : false,
        });

需要写上一大串,object. 这个属性怎么样,哪个属性有什么操作方式,太麻烦啦,这个时候就需要Object.defineProperties()

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

参数和 Object.defineProperty() 一样的
看看他怎么使用:

function Emp(id,ename,salary,age){
            this.id = id;
            this.ename = ename;  
            this.salary = salary;
            var _age;

            Object.defineProperties(this,{
                //只读 禁止删除
                id:{
                    writable : false,
                    configurable :false
                },
                // 姓名 禁止删除
                ename:{
                    configurable : false
                },
                //工资 禁止遍历
                salary:{
                    enumerable : false,
                    configurable : false
                },
                // 年龄 18-65岁
                age:{
                    get(){
                        return _age;
                    },
                    set(val){
                        if(val >= 18 && val <= 65){
                            _age = val;
                        }else{
                            throw new RangeError("年龄必须在18到65岁")
                        }
                    },
                    enumerable : true
                },

            });
            this.age = age; // 讲age挂到对象中
        }

在这里插入图片描述
这样不就是很方便,只需要对对象操作i一次, Object.defineProperties()就相当于是Object.defineProperty() 的一个综合操作,看它们的写法 defineProperty 改y 为i加上es就是复数形式。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值