三、对象的高级用法(ECMScript5):Object Array Function String
Object ------
1. 创建对象(前面使用的是1.使用对象直接量2.通过new创建对象)
Object.create(prototype,descriptors) //prototype为必需参数,要用作原型的对象,可以为null;第二个可选,属性描述项对象 ,即descriptors是个javascript对象{}
//数据属性描述符包含value特性:writable enumerable configurable,若未指定 都默认为false
//访问器属性描述符:设置属性值的函数set 返回属性值的函数get
1.1 var newObj.create(null,{
size:{
value:'large',
enumerable:true
},
shape:{
value:"round",
enmumerable:true
}
})
newObj.size;//large newObj.shape;//round
Object.getPrototypeOf(newObj);//null
1.2使用Object.create创建一个与Object对象具有相同对象的原型对象
var first={x:undefined,y:undefined}//定义的对象直接量
var second=Object.create(Object.prototype,{
x:{
value:undefined,
writable:true,
configurable:true,
enumerable:true
},
y:{
value:undefined,
writable:true,
configurable:true,
enumerable:true
},
})
Object.getPrototypeOf(first);//[object Object]
Object.getPrototypeOf(second);//[object Object]
2.1定义属性:2个静态函数 Object.defineProperty()、Object.defineProperties()
Object.defineProperty(object,propertyname,desciptor)//将属性添加到对象,或者修改现有属性的特性
Object.defineProperties(object,desciptors)//将多个属性添加到对象,或者修改现有多个属性的特性
例:
var obj={}
Object.defineProperty(obj,"newDataProperty",{
value:101,
writable:true,
enumerable:true,
configurable:true
});
obj.newDataProperty=102;//将newDataProperty的值101修改为102
document.write(obj.newDataProperty);//102
var obj={}
Object.defineProperties(obj,{
newDataProperty:{
value:101,
writable:true,
enumerable:true,
configurable:true},
newAccessorProperty:{
set:function(x){this.newaccpropvalue=x},
get:function(){retrun this.newaccpropvalue}
}
});
obj.newAccessorProperty=10;
document.write(obj.newAccessorProperty);//10
2.2.访问属性(前面使用的是1 .方式 2 数组方式 3 for in)
Object.getPrototypeOf(object);//返回指定对象object的原型
Object.getOwnPropertyDesciptor(object,propertyname);//获取指定对象object的私有属性描述符
Object.getOwnPropertyNames(object);返回指定对象object私有属性的名称,包括可枚举和不可枚举的属性和方法的名称
Object.keys(object);返回仅可枚举的的属性和方法的名称,object也可以是创建的对象或现有的dom对象
例:
1.--- function Pasta(grain,width){
this.grain=grain;
this.width=width;
}
var spaghetti=new Pasta("wheat",0.2); var proto= Object.getPrototypeOf(spaghetti)
docuement.write(proto===Pasta.prototype);//true
2-- function Pasta(grain,width,shape){
this.grain=grain;
this.width=width;
this.toString=function(){
return(this.grain+","+this.width+","+this.shape)
}
}
var spaghetti=new Pasta("wheat",0.2,"circle");
var arr= Object.getOwnPropertyNames(spaghetti);
docuement.write(arr);//grain,width,shape,toString
3--var obj={}
obj.newDataProperty="abc",
var descriptor=Object.getOwnPropertyDescriptor(obj,"newdataProperty");//获得对象私有属性的描述符
descriptor.writable=false;//修改特性
Object.defineProperty(obj,"newdataProperty",descriptor);//定义属性
var desc2=Object.getOwnPropertyDescriptor(obj,"newdataProperty");//获得对象私有属性的描述符
for(var prop in des2){
document.write(prop+':'+desc2[prop]);
document.write("<br/>");
}//value:abc writable:false enumerable:true configruable:ture
2.2配置属性的特性
Object.freeze(object);//阻止修改现有属性的特性和值,以及添加新属性
Object.seal(object);//阻止修改现有属性的特性,以及添加新属性,但可以修改属性的值
Object.preventExtensions(object);//阻止添加新属性,但修改属性的特性和值
举例:
1 var obj={ pasta:"spahetti",length:10}
Obeject.preventExtensions(obj);//只是阻止添加新属性
obj.newPorp=50; obj.pasta=50;
document.write(obj.newProp);//undefined
document.write(obj.pasta);//50
2 var obj={ pasta:"spahetti",length:10}
Obeject.freeze(obj);
obj.newPorp=50; obj.pasta=50;
document.write(obj.newProp);//undefined
document.write(obj.pasta);//"spahetti"
2.3检测属性的特性
Object.isSealed(object);//如果无法再对象中修改现有属性的特性,且无法向对象添加新属性,则 返回true
Object.isFrozen(object);//如果无法再对象中修改现有属性的特性和值,且无法向对象添加新属性,则 返回true
Object.isExtensible(object);//如果可扩展(即可添加新属性),则为true,否则返回false
举例:
var obj={ pasta:"spahetti",length:10}
if(!Object.isFrozen(obj)){obj.pasta=50;}
Object.freeze(obj)
document.write(obj.pasta)