在Javascript中获取Getter功能

问题描述 投票:14回答:4

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

javascript setter getter getter-setter
4个回答
11
投票

The old way

自此问题最初发布以来,__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)

The new way

创建动态访问器或增变器的当前标准方法是使用Object.definePropertyObject.defineProperties

可以使用Object.getOwnPropertyDescriptorObject.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 Classes

请注意,Object.getOwnPropertyDescriptor即使在使用getset关键字时也能正常工作,但如果您使用的是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)

17
投票

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

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

/* __lookupSetter__ */
Object.getOwnPropertyDescriptor(obj, 'MyField').set;

2
投票

看看lookupGetter


1
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.