您好,有没有办法在 javascript 中重载“.”(点)和 [] 运算符。即,如果我说 obj.Name 或 obj['Name'],它应该通过将 Name 作为参数传递来调用 obj 类中的通用方法。使用属性方法在 python 中可用的类似功能。但在这里我希望将“.Name”作为参数传递给通用方法。
像这样..
function Data(){
this.getValue(name){
return '...'
}
}
data = new Data()
name = data.Name
name = data['Name']
//both should call data.getValue()
最佳答案
2010 年回答:(2013 年更新见下文)
不,您不能将属性名称查找重定向到您自己的函数。
但是,从 ECMAScript5 开始,您可以使用“getter”和“setter”定义属性。这是一项尚未得到广泛支持的新功能,但一旦得到广泛支持,它就会做一些模糊类似的事情。这包含在 the spec 的几个部分中.因此,如果您以这种方式定义所有属性,然后将实际请求发送到您的中心 getValue
功能,你最终会得到你想要的。总有一天。 :-) 除了它不会调用 getValue
对于不存在的属性。
2013年回答:
这很快就会改变(对于最新的 Firefox 用户它是 already has):ECMAScript 第 6 版将有代理。它们在 draft specification 中定义,还有 this page (但规范草案优先)。
代理让您创建的对象是其他对象的真正代理(外观)。下面是一个简单的示例,它在检索时将任何字符串属性值全部转换为大写:
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"
您不覆盖的操作有其默认行为。在上面,我们覆盖的是 get
,但有一整套操作可供您 Hook 。
在get
处理函数的参数列表:
-
target
是被代理的对象(在我们的例子中是original
)。 -
name
是(当然)正在检索的属性的名称。 -
receiver
是代理本身或从它继承的东西。在我们的例子中,receiver
是===
proxy
, 但如果proxy
被用作原型(prototype),receiver
可能是一个后代对象,因此它在函数签名上(但在最后,如果像我们上面的示例一样,您实际上并不使用它,您可以轻松地将其关闭)。
这让您可以创建一个具有您想要的包罗万象的 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);
Live Example | Source (请注意我是如何将 receiver
排除在函数之外的,因为我们不使用它。receiver
是 set
上的可选第四个参数。)
上面的输出是:
Getting non-existant property 'foo' [before] obj.foo = undefined Setting non-existant property 'foo', initial value: bar [after] obj.foo = bar
请注意,当我们尝试检索 foo
时,我们是如何获得“不存在”消息的当它还不存在时,当我们创建它时再次出现,但不是随后。
关于Javascript重载点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4569296/