面向对象的程序设计
1.Value的值为只读的(defineProperty.规定属性,):
<script>
var person={};
Object.defineProperty(person,"name",{
writable: flase, //如果这里改为true,则第二个弹出框则为Grey
value:"Nicholas"
});
alert(person.name); //Nicholas
person.name="Grey";
alert(person.name); //Nicholas
</script>
2.把configurable设为false,标书不能从对象中删除属性:
<script>
var person={};
Object.defineProperty(person,"name",{
configurable: false,
value:"Nicholas"
});
alert(person.name);
delete person.name;
alert(person.name);
</script>
在调用Object.defineProperty()方法修改除writable之外的的特性,都会导致错误。也就是说,可以多次调用Object.defineProperty()方法修改同一属性,但在把configurable特性设置为false之后就会有限制了。
在调用Object.defineProperty()方法时,如果不指定,configurable、enumerable和writable特性的默认值都是false。
3.理解对象-访问器属性(P141)
<script>
var book={
_year:2004,
edition:1
};
Object.defineProperty(book,"year",{
get:function(){
return this._year;
},
set:function(newValue){
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;
}
}
});
book.year=2005;
alert(book.edition); //2
</script>
以上代码创建了一个book对象,并给它定义两个默认的属性:_year和edition._year前面的下划线是一种常用的标记,用于表示只能通过对象方法访问的属性。二访问器属性year则包含一个getter函数和一个setter函数。getter函数返回_year的值,setter函数通过计算来确定正确的版本。因此,把year属性修改为2005会导致_year变成2005,而edition变为2.
定义访问器的旧有方法:
<script>
var book={
_year:2004,
edition:1
};
book.__defineGetter__("year",function(){
return this._year;
});
book.__defineSetter__("year",function(newValue){
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;
}
});
book.year=2005;
alert(book.edition)
</script>
在不支持Object.defineProperty()方法的浏览器中不能修改[[Configurable]]和[[Enumerable]].
定义多个属性:
<script>
var book={};
Object.defineProperties(book,{
_year:{
value:2004
},
edition:{
value:1
},
year:{
get:function(){
return this._year;
},
set:function(newValue){
if(newValue>2004){
this._year=newValue;
this.edition+=newValue-2004;
}
}
}
});
var descriptor=Object.getOwnPropertyDescriptor(book,"_year");
alert(descriptor.value) //2004
alert(descriptor.configurable); //false
alert(typeof descriptor.get); //"undefined"
var descriptor=Object.getOwnPropertyDescriptor(book,"year")
alert(descriptor.value); //undefined
alert(descriptor.enumerable); //false
alert(typeof descriptor.get); //"function"
</script>