在Javascript中获取Getter功能

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.definePropertyObject.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)

ES6课程

请注意,Object.getOwnPropertyDescriptor即使使用getset关键字也能正常工作,但如果您使用关键字,则会有一些问题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)