javascript物件基礎(使用物件)---2物件、屬性、方法的高階操作-Object
三、物件的高階用法(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)