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__行为?所有棘手的解决方法都会有所帮助。
答案 0 :(得分: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。它不会跨浏览器工作。
答案 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。