Javascript重载点

Adh*_*dhi 10 javascript

嗨,有没有办法在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尚不存在时检索"不存在"消息时,以及当我们创建它时,我们会再次获取"非存在"消息,而不是随后.

  • 这家伙.和他的更新.我喜欢这个人和他的更新. (2认同)

Nic*_*ver 1

不,您不能在 JavaScript 中重载或替换它。我希望我能为您提供更全面/信息性的答案......但这只是不可能的,我想从来没有必要添加该功能。