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(); 返回一個實例;