嗨,有没有办法在javascript中重载'.'(点)和[]运算符.即如果我说obj.Name或obj ['Name']它应该通过传递Name作为参数来调用obj类中的公共方法.python中使用属性方法提供的类似功能.但是在这里我希望将".Name"作为参数传递给common方法.
像这样..
function Data(){
this.getValue(name){
return '...'
}
}
data = new Data()
name = data.Name
name = data['Name']
//both should call data.getValue()
Run Code Online (Sandbox Code Playgroud)
T.J*_*der 15
2010年答案 :( 2013年更新见下文)
不,您不能将属性名称查找重定向到您自己的函数.
但是,从ECMAScript5开始,您可以使用"getters"和"setter"定义属性.这是一项尚未得到广泛支持的新功能,但如果是这样的话,它将会做一些模糊相似的事情.这包含在规范的几个部分中.因此,如果您以这种方式定义了所有属性,然后将实际请求发送到您的中心getValue函数,那么您最终会得到您想要的内容.有一天.:-)除了它不会要求getValue一个不存在的财产.
2013年回答:
这将很快改变(它已经有最新的Firefox用户):ECMAScript第6版将有代理.它们在规范草案中定义,也在此页面上定义(但规范草案优先).
代理允许您创建对象是其他对象的真实代理(外观).这是一个简单的示例,它将任何字符串属性值转换为检索的所有上限:
var original = {"foo": "bar"};
var proxy = new Proxy(original, {
get: function(target, name, receiver) {
var rv = target[name];
if (typeof rv === "string") {
rv = rv.toUpperCase();
}
return rv;
}
});
console.log("original.foo = " + original.foo); // "bar"
console.log("proxy.foo = " + proxy.foo); // "BAR"
Run Code Online (Sandbox Code Playgroud)
您未覆盖的操作具有默认行为.在上面,我们覆盖的是get,但是有一个可以挂钩的操作列表.
在get处理函数的参数列表中:
target是被代理的对象(original在我们的例子中).name (当然)是要检索的属性的名称.receiver是代理本身还是从它继承的东西.在我们的例子中,receiver是=== proxy,但如果proxy被用作原型,receiver可能是一个后代对象,因此它在功能签名上(但最后,所以如果像上面的例子那样,你可以随时离开它实际上使用它.这使您可以使用所需的catch-all getter和setter功能创建一个对象:
var obj = new Proxy({}, {
get: function(target, name) {
if (!(name in target)) {
console.log("Getting non-existant property '" + name + "'");
return undefined;
}
return target[name];
},
set: function(target, name, value) {
if (!(name in target)) {
console.log("Setting non-existant property '" + name + "', initial value: " + value);
}
target[name] = value;
}
});
console.log("[before] obj.foo = " + obj.foo);
obj.foo = "bar";
console.log("[after] obj.foo = " + obj.foo);
Run Code Online (Sandbox Code Playgroud)
实例 | 来源 (注意我是如何离开receiver这些函数的,因为我们不使用它.receiver是一个可选的第四个arg on set.)
以上的输出是:
Getting non-existant property 'foo' [before] obj.foo = undefined Setting non-existant property 'foo', initial value: bar [after] obj.foo = bar
请注意当我们尝试在foo尚不存在时检索"不存在"消息时,以及当我们创建它时,我们会再次获取"非存在"消息,而不是随后.
| 归档时间: |
|
| 查看次数: |
1700 次 |
| 最近记录: |