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 )是否完全冻结