JS Object.defineProperty Configurable,Enumerable,Writable,Value,Getter,Setter屬性
阿新 • • 發佈:2018-12-21
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(); 返回一個例項;