記錄下JS Object.defineProperty Configurable,Enumerable,Writable,Value,Getter,Setter

Object.defineProperty使用

使用Object.defineProperty方法可以給類的實例添加屬性或方法,該方法有兩種傳參組合,對應兩種不同的效果。假設,我們需要給Date的所有實例添加p熟悉,可使用下面兩種方式:

常規方法

Object.defineProperty(Date.prototype, "p", {
    value: 4,
    enumerable: false,
    configurable: true,
    writable: true
});
參數解釋
Date.prototype後面那個參數,表示屬性名
value:屬性默認值
enumerable:是否可通過for-in循環,flase爲不可循環,默認值爲true
configurable:是否可調用defineProperty改變定義特性,默認值爲true
writable:是否可改變值,默認值爲true。爲false時,假設date變量爲Date類的實例,那麼此時改變值的語句如:date.p = 6、delete date.p 不生效

通過get/set方法

假設p1參數已經存在過
Object.defineProperty(Date.prototype, "p2", {
    enumerable: false,
    configurable: true,
    get: function() {
        return this.p1;
    },
    set: function(v) {
        this.p1 = v;
    }
});
參數解釋
enumerable:同上
configurable:同上
get:獲取值的函數,通過該函數可返回需要的值(注意:如果變量名爲p2,那麼函數內部不要含有this.p2的取值調用,否則會無限遞歸)。假設date變量爲Date類的實例,那麼此時var p = date.p2實際是調用的get方法
set:設置值的函數,通過該函數可設定值(注意點同理)。假設date變量爲Date類的實例,那麼此時date.p2 = 3實際是調用的set方法

在get和set模式下,實際上writable介於true和false之間,改變值的語句date.p = 4能夠生效,而語句 delete date.p 不生效。defineProperty函數,參數writable、value不能與get、set同時存在。

通過Object.defineProperty(Date.prototype, name, opt)可以給類的實例添加屬性和方法。而通過Object.defineProperty(Date, name, opt)可以給類添加靜態熟悉和方法,如:Object.defineProperty(Date, "getInstance", {enumerable: false, configurable: true, value: function() {return new Date();} }); ,此時可這樣調用函數 var date = Date.getInstance(); 返回一個實例;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章