2.对象的属性(描述对象)定义和获取

1–对象属性的定义 Object.defineProperty

1–简单的

		  obj.a=3;
          obj["b"]=5;

2–属性描述对象 Object.defineProperty

		var obj = {};
        Object.defineProperty(obj, "a", {
            
            configurable: false,// 是否可删除属性并且是否可以重定义该属性的属性描述对象,默认值是false
            
            enumerable: false,// 是否可以遍历,是否可枚举(该对象在使用for in遍历时,不可枚举属性是不能被遍历,也不能被Object.assign()复制)
            
            writable: false,// 是否可写,是否能够修改值
            
            value: 10,// 是值,还可以是function方法
        });

当定义set和get时,不能定义value和writable属性
get必须有返回,set必须有参数

		var obj = {_b:1};
 		Object.defineProperty(obj, "b", {
            configurable: false,
            enumerable: false,
            // get和set不能够和writable和value同时定义
            get: function () {
                return this._b;
            },
            set: function (value) {
                 this._b=value;
            }
        })


2----对象属性的获取

for in可以遍历所有的可枚举属性
浅紫色是不可枚举属性

1----将可枚举属性设置为不可枚举属性
普通的遍历对象获取属性,会遍历所有的可枚举属性

//普通的遍历对象获取属性,会遍历所有的可枚举属性
	var obj={
            a:1,
            b:2,
            abc:function(){
                console.log("abc")
            }
        }

        for(var prop in obj){
            console.log(prop);//a  b  abc
        }

当不需要遍历abc时,把abc设置为不可枚举属性

	  var obj={
            a:1,
            b:2
        }

        ------设置abc属性为不可枚举属性
        Object.defineProperty(obj,"abc",{//设置abc属性为不可枚举属性
            configurable:false,
            enumerable:false,
            writable:false,
            value:function(){
                console.log("abc")
            }
        });
        console.log(obj);//{a:1,b:2,abc:function()}
        obj.abc();//'abc'
        
		for(var prop in obj){
            console.log(prop);// a  b  abc不会被遍历
        }
----object assign只能复制对象的可枚举属性

		var obj1=Object.assign({},obj);
        console.log(obj1)//复制的obj1也没有abc属性

2----将不可枚举修改为可枚举属性

需要先重定义将configurable设置为true,然后设置enumerable设置为true

	  var obj={
            a:1,
            b:2
        }
        Object.defineProperty(obj,"abc",{
            configurable:true,//---------------
            enumerable:false,
            writable:false,
            value:function(){
                console.log("abc")
            }
        });
         Object.defineProperty(obj,"abc",{
            enumerable:true//-----------
        });
        for(var prop in obj){
            console.log(prop);
        } 

原型链属性是不可以被修改的,也不能被删除,不会报错

		var obj={
            a:1,
            b:2
        }
		Object.defineProperty(obj,"__proto__",{
            enumerable:true,
        })
        delete obj.__proto__;
        console.log(obj);//还是原来的

configurable设置为false的时候,该对象属性是不能被删除的,也不会报错

//configurable是false,不能删除
       delete obj.abc;

当设置writable为false,configurable:true 不能被修改,能被删除

	Object.defineProperty(obj,"c",{
            configurable:true,
            enumerable:true,
            writable:false,
            value:10
        });
        delete obj.c;
        obj.c=20;
        console.log(obj);   //{c:10}

既不能修改又不能删除

	   Object.defineProperty(obj,"c",{
            enumerable:true,
            value:100
        });
        console.log(obj);


3-----定义多个属性 Object.defineProperties

Object.defineProperties(obj,{
            "c":{
                // 描述对象
                value:function(){
                }
            },
            d:{
                // 描述对象
                value:10,
                writable:true
            },
            e:{
                value:20,
                writable:true,
                configurable:true
            },
            f:{
                value:30,
                enumerable:true
            }
        });
        console.log(obj);


4------获取所有属性名称

获取obj的所有属性,包括不可枚举属性,不包括__proto__,把所有的属性名放在一个数组中返回

		var arr=Object.getOwnPropertyNames(obj);
        console.log(arr);


5-----获取该属性的描述对象

 // 获取某个属性的描述对象
        var desc=Object.getOwnPropertyDescriptor(obj,"f");
        console.log(desc);     //{configurable:false,enumerable:true,writable:false,value:30,}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

胡肖一

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值