javascript对象---5 Object全局内置函数

Object全局内置函数:如下函数都是ECMASCRIP5中扩展的,不是所有浏览器都能兼容。

defineProperty(obj.filedName. configObj):  1.定义对象的数据属性。 2.定义对象访问器属性。

一. 定义一个对象的数据属性

var cat = {
                name :"tom"
            }
            //未 限制之前可以修改name
            cat.name="jerry";
            console.log(cat.name);  

-------输出   jerry

 

defineProperty(  你要限制的对象  ,要限制对象的哪一个属性,( 对于属性的配置){

value : "  "   //属性值

writable : false/true  //是否可写可修改

enumerable : false /true  // forin是否可遍历

configerable : false/true   //是否可以重新配置属性

}

 

1. 利用  defineProperty 修改对象的值

Object.defineProperty( cat, "name" ,{
                value: "jerry"
   })
 console.log(cat.name);

结果----jerry

2. writable   是否可以修改  可以定义程序全局变量不可修改

Object.defineProperty( cat, "name" ,{
                value: "jerry" ,
                writable : true,  // 当前属性是否可以修改
            })
            
            cat.name="miaomiao";  //重新修改name的值
            console.log(cat.name)

结果--------miaomiao

Object.defineProperty( cat, "name" ,{
                value: "jerry" ,  //修改name值
                writable :  false,  // 当前属性是否可以修改
            })
            
            cat.name="miaomiao";  //不可以继续修改name的值 --不报错但不修改
            console.log(cat.name)

结果--------jerry

3.用法 : 定义常量

var Math1 = {

PI : 3.1415926

}

Object.defineProperty( Math1 , ' PI', {

writable :false          //后面不加分号 加逗号 ,是一个对象

})

Math1.PI =3 ; //保证 不被修改

4. enumerable : 是否可以在 for - in循环中访问到

Object.defineProperty( cat, "name" ,{
                value: "jerry" ,
                writable : true,    // 当前属性是否可以修改
                enumerable: true, // 是否在 for - in循环中访问到

            })
            for( var i in cat ){               //获取对象中所有属性名属性值    i 属性名
                console.log(i+"的值为" + cat[i]); //属性名

            }

结果----------

如果将  enumerable 设为 false 则不能访问 name

结果-i-----

name 的值为 jerry   (没有name值)

5.configerable  //是否可以重新配置

6.使用 delete cat.name; 可以删除对象的属性

delete cat.age ;

 alert(cdat.age) ;   // undefined

二 .判断数据合理性 age不能到2200   定义对象访问器属性

1.定义对象访问器属性的作用:

数据封装,把属性信息隐藏, 只能根据开发者提供的get.、set方法访问属性信息(get、set方法可以不同时存在)

//数据的访问器属性
            var cat ={
                name :"",
                _age : "",
            };
            //在内存中可以看到 age 但访问不了,只能由 get set 方法访问   深层封装  _age
            Object.defineProperty( cat, "age", {            //定义的是age属性  不是_age 
                enumerable :true,
                configerable:true,
                get : function(){

                   alert("get");
                    return this . _age;     //赋值给age
                },
                set : function(newValue){      //设置规则

                    alert("set");
                    if(newValue >=200){
                        alert("年龄过大")
                    }else{
                        this._age = newValue; //会出现死循环  一给 this.age赋值久调用set 不能用age  所以设不同的 _age 值,将_age封装起来, 返回age
                    }
                }
                
            })
            //在访问person.age会调用get方法,set方法  不能直接访问属性,只能通过get 方法,起到封装的作用
            cat.age=300;     //年龄过大

alert(cat.age) ;----调用的是get方法   defineProperty中的属性

1.弹出---------set

2.弹出---------年龄过大--------- 没有赋值

3、弹出---------get  -----return  空值

4.弹出-----------空(没有赋值)

cat.age=100;

alert(cat.age)

1.弹出---------set

2.弹出---------get

3.弹出---------100

三.定义对象访问器属性的作用:

数据封装,把属性信息隐藏,只能根据开发者提供的 get set  方法访问属性信息(get、set方法可以不同时存在)  给属性赋值时会调用 set  方法

四.访问器属性的注意事项:

在定义set方法时只要执行属性赋值,this.age = newValue, 就会造成死循环,每次给this.age赋值又会调用this.age ,因此按照习惯在对象属性前加 _。

定义时 _age: ” “           设置属性时:    Object.defineProperty( cat, "age",  {}) 

调用时 ===》 cat . age( 不直接调用在对象中定义的属性)

四、使用Object.defineProperties 为一个对象的多个属性,进行 数据访问器属性  的赋值

Object.defineProperties( 对象 ,{ 配置})

var cat ={
                name :"",
                _age : "",
            };

Object.defineProperties( cat, {
                name:{
                    value :"Tom",
                } 
,
                
                _age : {
                    value : 0,
                    writable :false        
//不可修改
                } ,
                
                age :{                   //访问器属性
                        
                      
 get : function(){
                            console.log("get");
                            return this._age;
                    },
                  
 set : function(newValue){ //设置规则
                            console.log("set")
                            if(newValue >=200){
                              console.log("年龄过大");
                        }else{
                            console.log("赋值")
                            this._age = newValue; //会出现死循环  一给 this.age赋值久调用set 所以 _age
                        }
                    }
                }

            })
            
            console.log(cat.name);
            console.log(cat.age) ;

结果:

Tom

get

0

如果改为 给age赋值 ---不会改变因为 _age的writable :false

cat.age=100;
            console.log(cat.name);
            console.log(cat.age) ;

//结果为

set

赋值

Tom

get

0

五. Object全局内置函数

Object.getOwnPropertyDescriptor( Obj,field) :(对象 , 属性)  获取对象属性的 访问器,或 数值属性

    var cat ={
                name :"",
                _age : "",
            };
            
            Object.defineProperties( cat, {
                name:{
                    value :"Tom",
                },
                
                _age : {
                    value : 0,
                    writable :false
                },
                
                age :{
                        
                        get : function(){
                        console.log("get");
                        return this._age;
                    },
                    set : function(newValue){ //设置规则
                        console.log("set")
                        if(newValue >=200){
                            console.log("年龄过大");
                        }else{
                            console.log("赋值")
                            this._age = newValue; //会出现死循环  一给 this.age赋值久调用set 所以 _age
                        }
                    }
                }
            })
            
            var obj = Object.getOwnPropertyDescriptor( cat, "name");   (对象 , 属性)
            debugger  //到这后跟踪 obj

属性的默认值为 true

 

2,Object.getOwnPropertyDescriptor :获取对象所有属性名,不包括 prototy中属性。

var names = Object.getOwnPropertyNames(cat); //
  debugger  //到这后跟踪 names

”_age“ 也在内存中,但一看就知道是一个封装属性

3.  Object.keys(cat)   获取对象所有枚举的属性名,不包括 prototy中属性。

var keys = Object.keys(cat); 
            debugger 

如果给age中设置enumerable :true, age也出现

4 .Object.preventExtensions(对象)   锁住对象属性,使其不能拓展,也就是不能增加新的属性,原有的属性值仍然可以更改,可以删除。

可扩展对象 cat.jiao = "miao"  --可以扩展

但如果

Object.preventExtensions(cat);

cat.jiao = "miao"

8.

则对象扩展不执行

5.  Object.isExtensible(cat);  用于判断对象是否可被拓展,返回true false

6. Object.seal(cat)  让对象既不可以拓展也不可以删除属性,属性值可以修改

7.Object.isSealed(cat); //判断对象是否被密封

8.Object全局内置函数

Object.freeze( obj ) :完全冻结对象,在seal基础上,属性值也不可以修改

Object. isFrozen( obj )是否完全冻结

转载于:https://my.oschina.net/u/2991733/blog/794866

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值