Object.defineProperty和Object.defineProperties

添加属性到对象,或修改现有属性的特性
 
用法:
    Object.defineProperty(object, propertyName, descriptor);
参数:
    object : 作用的对象,可以是javascript对象,或dom对象。
    propertyName : 属性名,字符串。
    descriptor : 属性的特性描述,区分数据属性访问器属性
返回值:
    修改后的对象。
异常:
   1. object不是对象。
    2. object不可扩展。
    3. descriptor有value或writable特性,同时有get和set特性。
    4. descriptor的get和set特性不是函数。
    5. 对象的属性名已存在,同时descriptor的configurable特性为false,且descriptor包含一个以上与现有属性的特性不同的特性。但configurable为false,且writable为true时,允许value或writable特性不同。
 
defineProperties和defineProperty差不多,就不介绍了。
 
例子:
'use strict';
(function(){
    if(!Object.defineProperty){
        console.log('浏览器不支持defineProperty');
        return;
    }

    var person = {};

    //向person添加name属性和它的访问器
    Object.defineProperty(person, 'name', {
        set : function(n){
            console.log('set 访问器');
            this.nameValue = n; //一个新的属性,如果同样是name的话,就死循环了。
        },
        get : function(){
            console.log('get 访问器');
            return 'my name is ' + this.nameValue;
        },
        //value : 'jeck', //如果在这里有value或writable特性,就会报错:Uncaught TypeError: Invalid property.  A property cannot both have accessors and be writable or have a value。
        enumerable: true,
        configurable: true
    });
    person.name = "haha";   //触发set访问器
    console.log(person.name);   //触发get访问器 output: my name is haha
    console.log(person.nameValue);  //output: haha

    //向person添加id数据属性。
    Object.defineProperty(person, 'id', {
        value : '1234567890',
        writable : false,
        enumerable : false,
        configurable : false
    });
    console.log(person.id); //output: 1234567890
    //person.id = '0987654321'; //报错,因为id是只读的,不可写。


    //列出对象的属性
    var propertyNames = Object.getOwnPropertyNames(person);
    for(var i = 0, len = propertyNames.length; i < len; i++){
        var name = propertyNames[i]
        console.log(name + ': ' + person[name]);
    }
    /*output:
        name: my name is haha
        nameValue: haha
        id: 1234567890*/

    //列出某一属性的所有特性。
    var descriptor = Object.getOwnPropertyDescriptor(person, 'id');
    descriptor.writable = true;//这里将原来的writable特性改为了true。
    for(var prop in descriptor){
        console.log(prop + ': ' + descriptor[prop]);
    }
    /*output:
        value: 1234567890
        writable: true
        enumerable: false
        configurable: false*/ 


    //defineProperty的复数版:
    Object.defineProperties(person, {
        sex : {
            value : 'boy',
            writable : true,
            enumerable : false,
            configurable : true
        },
        age : {
            set : function(x){
                this.ageValue = x;
            },
            get : function(){
                return this.ageValue;
            }
        }
    });

    person.sex = 'girl';    //变性成功!
    person.age = 23;

    console.log('sex: ' + person.sex);
    console.log('age: ' + person.age);
    /*output:
        sex: girl
        age: 23*/
})();

 

posted @ 2013-07-20 18:08  chollaflower  阅读(1511)  评论(0编辑  收藏  举报