在JavaScript中,可以通过以下方式创建getters和setters:
function MyClass(){
var MyField;
this.__defineGetter__("MyField",function(){
return MyField;
});
this.__defineSetter__("MyField",function(value){
MyField = value;
});
}
但是有没有办法获得Getter或Setter函数呢?我的想法是这样的:
var obj = new MyClass();
obj.__getSetter__("MyField")("MyValue");
在扩展基类时,我需要这样的功能。例如:类"a“有字段"a",类"B”从"A“扩展而来,也希望有一个字段"A”。要将值从“B”-field的"A"-object传递到"a"-field的“a”-object,我需要在重写它们之前获取setter/getter函数。
发布于 2011-01-28 07:06:17
老方法
自此问题首次发布以来,__defineGetter
和__defineSetter__
一直处于弃用状态。
访问这些访问器和赋值器函数分别由__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)
ES6类
请注意,即使使用get
和set
关键字,Object.getOwnPropertyDescriptor
也可以正常工作,但是如果使用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)
发布于 2014-12-22 10:14:28
实际上,__lookupGetter__
和__lookupSetter__
方法是不推荐使用的。而不是这些,您必须使用:
/* __lookupGetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').get;
/* __lookupSetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').set;
发布于 2011-01-28 07:03:24
看看吧。
https://stackoverflow.com/questions/4822953
复制相似问题