在JavaScript中,可以通过以下方式创建getter和setter:
function MyClass(){
var MyField;
this.__defineGetter__("MyField",function(){
return MyField;
});
this.__defineSetter__("MyField",function(value){
MyField = value;
});
}
但有没有办法获得Getter或Setter FUNCTION?我想到这样的事情:
var obj = new MyClass();
obj.__getSetter__("MyField")("MyValue");
扩展基类时我需要这样的功能。例如:类“A”具有字段“a”,类“B”从“A”延伸并且还希望具有字段“a”。要将值从“B” - 对象的“a”字段传递到“A”对象的“a”字段,我需要在覆盖它们之前获取setter / getter函数。
自此问题最初发布以来,__defineGetter
和__defineSetter__
已被弃用。
访问这些访问器和mutator函数分别使用__lookupGetter__
和__lookupSetter__
处理。
function MyClass() {
var MyField
this.__defineGetter__("MyField",function(){
return MyField
})
this.__defineSetter__("MyField",function(value){
MyField = value
})
}
var obj = new MyClass()
obj.__lookupSetter__("MyField")("MyValue")
console.log(obj.MyField)
创建动态访问器或增变器的当前标准方法是使用Object.defineProperty
或Object.defineProperties
。
可以使用Object.getOwnPropertyDescriptor
和Object.getOwnPropertyDescriptors
来访问访问器和增变器功能。
function MyClass() {
let MyField
Object.defineProperty(this, 'MyField', {
get: () => MyField,
set: value => {
MyField = value
}
})
}
var obj = new MyClass()
Object.getOwnPropertyDescriptor(obj, 'MyField').set('MyValue')
console.log(obj.MyField)
请注意,Object.getOwnPropertyDescriptor
即使在使用get
和set
关键字时也能正常工作,但如果您使用的是class
关键字,则会有一些问题。
在class
上定义的访问器和更改器不是该类实例的“自有属性”。相反,它们属于该类的原型(class
只是用于声明原型的语法糖)。
因为添加到类中的函数被添加到原型中,所以在调用getter或setter时需要注意上下文。
class MyClass {
get MyField() {
return this._myField
}
set MyField(value) {
this._myField = value
}
}
const obj = new MyClass()
Object.getOwnPropertyDescriptor(MyClass.prototype, 'MyField').set.call(obj, 'MyValue')
console.log(obj.MyField)
实际上,__lookupGetter__
和__lookupSetter__
方法已被弃用。而不是这些你必须使用:
/* __lookupGetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').get;
/* __lookupSetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').set;
看看lookupGetter。
在Google Chrome中,lookupGetter / lookupSetter已损坏:http://code.google.com/p/chromium/issues/detail?id=13175