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 )是否徹底凍結