Javascript重载点

标签 javascript

您好,有没有办法在 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"

Live Example | Source

您不覆盖的操作有其默认行为。在上面,我们覆盖的是 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 排除在函数之外的,因为我们不使用它。receiverset 上的可选第四个参数。)

上面的输出是:

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/

相关文章:

php - 如何使用年龄验证脚本正确重定向?

javascript - XMLHttpRequest 对象

javascript - JQuery Packery 中心项目

javascript - 多个可拖动标记未更新

javascript - HTML <source> 标签上的 Webpack JSX 错误

javascript - 使用 jQuery 动态获取输入字段的值并使用 PHP 处理它们

javascript - 如何使用 webgl 处理和更新大型数组?

javascript - 环回 - EmbedsOne 关系产生错误

javascript - 如何在多个 div 元素和上下文中初始化 typeahead.js?

javascript - 未捕获的类型错误 : Cannot set property 'checked' of null