用函数重写Javascript属性

Overriding a Javascript property with a function

本文关键字:属性 Javascript 重写 函数      更新时间:2024-04-02

我想用函数覆盖对象属性,这样无论何时调用对象的属性,它都会调用函数并返回结果。

这在JS这样的动态语言中应该是可能的吗?

上下文:

我正在尝试将一些仅限IE的代码移植到其他浏览器。该代码广泛使用"Microsoft.XMLDOM"对象来解析和查询XML文档。我想在非IE浏览器中使用标准的DOMParser。问题是,Microsoft实现为XML元素公开了一个非标准的"text"属性,而这个属性在代码库中被广泛使用,我想在Element原型上添加一个等效的函数。

Element.prototype.text = function() {...}

不起作用,因为当代码库执行"myelem.text"时,它实际上并没有运行函数,只是返回一个指向它的指针。

我该怎么做才能让它发挥作用?

在足够现代的Javascript(例如IE以外的任何东西)中,Object.defineProperty可以做到这一点。

Object.defineProperty(Element.prototype, 'text', {
    'get': function() {
        return this.getText();
    },
    'enumerable': true
});

如果您不需要函数的外部参数,您可以在定义它之后执行,如下所示:

Element.prototype.text = (function() {...})();

然后,在调用之后

Element.text

您将从函数中获得返回值。