javascript的Object對象的defineProperty和defineProperties

Object的屬性函數

查看官網:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object

第一段代碼:
var person={};
Object.defineProperty(person,'name',{
    configurable:true,//可否使用delete、可否修改屬性特性、或可否修改訪問器屬性、,false爲不可從新定義,默認值爲true
    enumerable:false,//對象屬性是否可經過for-in循環,flase爲不可循環,默認值爲true
    //writable:true,//對象屬性是否可修改,flase爲不可修改,默認值爲true
    //value:'huang', //對象屬性的默認值,默認值爲undefined
    set:function(newValue){
        this.name=newValue;
    },
    get:function(){
        return this.name;
    }
});

當get,set出現的時候不能出現value和writable,
不然報錯:Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #<Object>
    at Function.defineProperty (<anonymous>)
    at <anonymous>:2:8





第二段代碼:
var waterfall={};
Object.defineProperty(waterfall,'name',{
    configurable:true,//可否使用delete、可否修改屬性特性、或可否修改訪問器屬性、,false爲不可從新定義,默認值爲true
    enumerable:false,//對象屬性是否可經過for-in循環,flase爲不可循環,默認值爲true
    //writable:true,//對象屬性是否可修改,flase爲不可修改,默認值爲true
    //value:'huang', //對象屬性的默認值,默認值爲undefined
    set:function(newValue){
        this.name=newValue;
    },
    get:function(){
        return "Namess"+this.name;
    }
});
問題:這段代碼會報錯,由於在set和get函數裏出現了this.name= 和 return 裏有this.name
致使一直循環遞歸沒法中止,才報錯的。
相似於:
    function a() {
        a();
    }
調用a,會無限循環。

解決辦法是:
var waterfall={};
Object.defineProperty(waterfall,'name',{
    configurable:true,//可否使用delete、可否修改屬性特性、或可否修改訪問器屬性、,false爲不可從新定義,默認值爲true
    enumerable:false,//對象屬性是否可經過for-in循環,flase爲不可循環,默認值爲true
    //writable:true,//對象屬性是否可修改,flase爲不可修改,默認值爲true
    //value:'huang', //對象屬性的默認值,默認值爲undefined
    set:(newValue)=>{
        this.name=newValue;
    },
    get:()=>{
        return "Namess"+this.name;
    }
});





Object.defineProperties(object, props)
參數
object: 定義的對象
props: 添加的屬性, key和 value 分別Object.defineProperty 中的第二和第三個參數。
例子:

let waterfall={};
Object.defineProperties(waterfall,{
    name:{
        configurable:true,
        enumerable:true,
        set:(val)=>{
            this.name=val
        },
        get:()=>{
            return this.name
        }
    },
    age:{
        configurable:true,
        enumerable:true,
        set:(val)=>{
            this.age=val
        },
        get:()=>{
            return this.age
        }
    }
})




Object的6個屬性:
configurable,enumerable,writable,value,setget。


Object.observe已經被廢棄。
Object.keys(waterfall) //[ 'name', 'age' ]
相關文章
相關標籤/搜索