Van*_*ing 16 javascript getter setter getter-setter
在JavaScript中,可以通过以下方式创建getter和setter:
function MyClass(){
var MyField;
this.__defineGetter__("MyField",function(){
return MyField;
});
this.__defineSetter__("MyField",function(value){
MyField = value;
});
}
Run Code Online (Sandbox Code Playgroud)
但有没有办法获得Getter或Setter FUNCTION?我想到这样的事情:
var obj = new MyClass();
obj.__getSetter__("MyField")("MyValue");
Run Code Online (Sandbox Code Playgroud)
扩展基类时我需要这样的功能.例如:类"A"具有字段"a",类"B"从"A"延伸并且还希望具有字段"a".要将值从"B" - 对象的"a"字段传递到"A"对象的"a"字段,我需要在覆盖它们之前获取setter/getter函数.
ale*_*ods 17
其实,__lookupGetter__和__lookupSetter__方法过时.而不是这些你必须使用:
/* __lookupGetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').get;
/* __lookupSetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').set;
Run Code Online (Sandbox Code Playgroud)
zzz*_*Bov 13
__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)Run Code Online (Sandbox Code Playgroud)
创建动态访问器或更改器的当前标准方法是使用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)Run Code Online (Sandbox Code Playgroud)
请注意,Object.getOwnPropertyDescriptor即使使用get和set关键字也能正常工作,但如果您使用关键字,则会有一些问题class.
在a 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)Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5824 次 |
| 最近记录: |