24

在 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 函数。

4

4 回答 4

21

老办法

__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.definePropertyor 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 类

请注意,Object.getOwnPropertyDescriptor即使使用getandset关键字也可以使用,但是如果您使用关键字,则会出现一些问题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)

于 2011-01-27T23:06:17.423 回答
21

实际上,__lookupGetter____lookupSetter__方法已被弃用。而不是这些,您必须使用:

/* __lookupGetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').get;

/* __lookupSetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').set;
于 2014-12-22T02:14:27.993 回答
2

看看lookupGetter

于 2011-01-27T23:03:23.670 回答
1

在 Google Chrome 中,lookupGetter/lookupSetter 坏了:http ://code.google.com/p/chromium/issues/detail?id=13175

于 2012-01-31T20:38:18.793 回答