8
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__ 行为?所有棘手的解决方法都会有所帮助。

4

5 回答 5

10

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

不,JavaScript 中没有用于任意属性的 getter/setter。

在 Firefox 中,您可以使用 JavaScript 1.5+ 的 getter 和 setter 来定义x属性y,使其值在赋值时平方,例如:

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

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

于 2009-11-11T00:03:16.313 回答
7

不,但是有计划在 JavaScript 2 中支持类似的功能。以下对象文字语法已在Mozilla 错误 312116中提出,似乎它可能是对对象文字的处理方式:

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

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

于 2009-11-11T00:07:43.837 回答
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
于 2009-11-11T00:05:31.733 回答
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
于 2009-11-17T15:13:03.700 回答
1

我认为您不能[]在当前版本的 JavaScript 中覆盖该运算符。在当前的 JavaScript 中,对象在很大程度上只是关联数组,因此[]运算符只需将键/值对添加到作为对象的数组中。

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

JavaScript2 有一些关于运算符重载的规范,但该规范是 MIA。

于 2009-11-11T00:04:38.410 回答