javascript對象---5 Object全局內置函數

Object全局內置函數:以下函數都是ECMASCRIP5中擴展的,不是全部瀏覽器都能兼容。瀏覽器

defineProperty(obj.filedName. configObj):  1.定義對象的數據屬性。 2.定義對象訪問器屬性。函數

一. 定義一個對象的數據屬性this

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

-------輸出   jerrydebug

 

defineProperty(  你要限制的對象  ,要限制對象的哪個屬性,( 對於屬性的配置){對象

value : "  "   //屬性值ip

writable : false/true  //是否可寫可修改內存

enumerable : false /true  // forin是否可遍歷開發

configerable : false/true   //是否能夠從新配置屬性get

}

 

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.彈出---------年齡過大--------- 沒有賦值

三、彈出---------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( 不直接調用在對象中定義的屬性)

4、使用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 )是否徹底凍結

相關文章
相關標籤/搜索