如何在JavaScript中使用参数模拟属性?

时间:2016-09-14 17:07:39

标签: javascript

编辑这不是重复的b / c我不能使用其限制的setter b / c,这些不是在运行时之前没有定义的“动态”属性。我正在寻找与vb.net支持的相同的东西......带参数的属性设置器。在这种情况下,你会得到额外的参数进入属性的setter,但是属性是在运行时定义的(是的,我猜它是一个元属性)。我知道这样做不会有效,所以正在寻找这种模仿。

如果有帮助,我可以通过ES6使用任何解决方案,但我不必这样做。这不是ES6问题。

语言中是否有任何方法可以模仿我所寻求的调用约定?

var myClass = new MyClass();
myClass.Setting('mysettingname') = 4;

我知道我可以做myClass.Setting['mysettingname'] = 4;之类的事情,但我需要在设置时运行代码。这就是皱纹。

ES5.1 JavaScript Setter不是解决方案。如果向setter添加参数,它将不会运行:

MyClass = function(){

  set setting(name, value) { // error b/c of name
    // code that needs to run
  }
};

在php中他们有魔术吸气剂和制定者,如下所示:

   public function __set($key, $value) {
      // assign value for key UserID to _userID property
   }

   public function __get($key) {
      // return value of _userID for UserID property
   }

在vb.net中,他们拥有带参数的属性:

Public Property Marks(Byval index as Integer) as Integer
Get
    If (index < NoofSubjects()) And index >= 0 Then
           return _marks(index)
    Else
    Throw new Exception("Index should be in the range 0 to " & (NoofSubjects-1))
    End If
End Get 

Set(Byval value as Integer)
    If (index < NoofSubjects()) And index >= 0 Then
    _marks(index) = value
    Else
    Throw new Exception("Index should be in the range 0 to " & (NoofSubjects-1))
    End If

End Set
End Property

1 个答案:

答案 0 :(得分:2)

您可以使用Proxy

&#13;
&#13;
class MyClass {}

const myClass = new Proxy(new MyClass, {set: (target, property, value) => {
  // Do here whatever you want with property and value
  console.log(`property: ${property}, value: ${value}`)
  return target[property] = value
}})

myClass.mysettingname = 4
&#13;
&#13;
&#13;