1.属性类型:数据属性和访问器属性
特性是内部值,用[[]]表示
一、数据属性:
[[Configurable]]:表示能否通过delete删除属性从而重新定义属性,能否修改属性的特性,能否把属性修改为访问器属性。
[[Enumerable]]:表示能否通过for-in循环属性
[[Writable]]:表示能否修改属性的值
[[Value]]:包含这个属性的数据值
修改属性的默认特性,用ECMAScript5的Object.defineProperty()方法。
var person={}
Object.defineProperty(person,"name"{
writable:false,
value:'Nicholas'
}
alert(person.name)//Nicholas
person.name="222"
alert(person.name)//Nicholas
//使用Object.defineProperty创建的新属性
//默认configurable,emumerable,writable默认为false
二、访问器属性
[[Configurable]]
[[Enumerable]]
[[Get]]
[[Set]]
访问器属性必须调用Object.defineProperty()来定义。
var book={
_year:2014,
edition:1
}
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValue){
if(newValue>2014){
this._year=newValue;
this.edition+=newValue-2014;
}
}
})
book.year=2015;
console.log(book.edition) //2
在这个方法之前,要创建访问器属性,一般都使用两个非标准方法:
//__defineGetter__ ()和__defineSetter__ ()
book.__defindGeeter__("year",function(){
return this._year
}
book.__defineSetter__("year",funciton(newValue){
if(newValue>2014){
this._year=newValue;
this.edition+=newValue-2014;
}
定义多个属性 Object.defineProperties()方法。
Object.defineProperties(book,{
__year:{
writable:true,
value:2014
},
edition{
writable:true,
value:1
},
...
})
读取属性特性(返回一个对象)
Object.getOwnPropertyDescriptor()方法
对象属性访问器有:configurable,enumerable,get,set
对象属性属性有:configurable,enumerable,writable,value
var desciptor=Object.getOwnPropertyDescriptor(book,"_year")
alert(descriptor.value) //2014
alert(descript.configurable)//false
Object.getOwnPropertyNames() //获取所有实例属性(包括不可以枚举)
Object.key()获取可枚举属性的字符串数组。
对象的枚举
for(var prop in obj){
console.log(obj.prop)
//这个会隐式转为obj['prop']
//在obj上找prop属性
hasOwnProperty
obj.hasOwnProperty(prop) 判断是否为obj自己的属性,是为true
属性 in obj
是否有属性,可以在原型链上找
确定是否该属性在对象中还是在原型中
function hasPrototypeProperty(object,name){
return !object.hasOwnProperty(name)&&(name in object)
}
isPropotypeOf()方法确定对象之间是否存在这种关系
Person.propotype.isProptotypeOf(person1) //true
ECMAScript5新增方法 Object.getPropotypeOf()
Object.getPropotypeOf(person1)===Person.prototype //true