面向对象的程序设计

 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>

 

posted @ 2017-09-05 11:47  枚齐元子  阅读(108)  评论(0编辑  收藏  举报