JavaScript相当于Python的__setitem__

时间:2009-11-10 23:48:15

标签: javascript python syntactic-sugar

var obj = {}
obj.__setitem__ = function(key, value){
  this[key] = value * value
}
obj.x = 2  // 4
obj.y = 3  // 9

JavaScript没有__setitem__,这个例子显然不起作用。

在python __setitem__中的工作方式如下:

class CustomDict(dict):
  def __setitem__(self, key, value):
    super(CustomDict, self).__setitem__(key, value * value)

d = CustomDict()
d['x'] = 2  # 4
d['y'] = 3  # 9

是否可以在JavaScript中实现__setitem__行为?所有棘手的解决方法都会有所帮助。

5 个答案:

答案 0 :(得分:10)

  

是否可以在JavaScript中实现__setitem__行为?

没有。 JavaScript中的任意属性都没有getter / setter。

在Firefox中,您可以使用JavaScript 1.5 +的getter和setter定义xy属性,这些属性在赋值时对其值进行平方,例如:

var obj= {
    _x: 0,
    get x() { return this._x; },
    set x(v) { this._x=v*v; }
};
obj.x= 4;
alert(obj.x);

但是你必须为你想要提前使用的每个命名属性声明一个setter。它不会跨浏览器工作。

答案 1 :(得分:7)

不,但是有计划在JavaScript 2中支持类似的功能。Mozilla bug 312116上已经建议使用以下对象文字语法,似乎它可能是如何为对象文字做的:

({
  get * (property) {
    // handle property gets here
  }
})

我假设也支持set(如set * (property, value) {...})。

答案 2 :(得分:5)

你可以这样做(因为javascript中的对象也是关联数组):

var obj = {};
obj._ = function(key, value){
  this[key] = value * value;
}
obj._('x', 2);  // 4
obj._('y', 3);  // 9

alert(obj.x + "," + obj.y); //--> 4,9

答案 3 :(得分:5)

在常用的Javascript版本中没有真正的setter和getter,因此如果你想模拟效果,你必须使用一些不同的语法。对于属性obj.x,使用obj.x()访问属性的值,使用obj.x(123)来设置值似乎是一种相当方便的语法。

可以这样实现:

// Basic property class
function Property(value) {
   this.setter(value);
}

Property.prototype.setter = function(value) {
   this.value = value * value;
}

Property.prototype.getter = function() {
   return this.value;
}

Property.prototype.access = function(value) {
   if (value !== undefined)
      this.setter(value);
   return this.getter();
}


// generator function to add convenient access syntax
function make_property(value) {
   var prop = new Property(value);
   function propaccess(value) {
      return prop.access(value);
   }
   return propaccess;
}

现在,make_property生成的属性支持所需的语法和方形值:

var obj = {
   x: make_property(2)
};

alert(obj.x()); // 4
obj.x(3);       // set value
alert(obj.x()); // 9

答案 4 :(得分:1)

我认为你不能在当前版本的Javascript中覆盖[]运算符。在当前的Javascript中,对象主要只是关联数组,因此[]运算符只是将一个键/值对添加到作为对象的数组中。

您可以编写设置特定值甚至平方数字的方法,并将该值添加为键/值对,但不能通过重载[]运算符。

Javascript2有一些操作符重载的规范,但该规范是MIA。