【问题标题】:Overriding a Javascript property with a function用函数覆盖 Javascript 属性
【发布时间】:2012-07-29 00:17:19
【问题描述】:

我想用一个函数覆盖一个对象的属性,这样每当对象的属性被调用时,它就会调用该函数并返回结果。

这在 JS 之类的动态语言中应该可以实现吗?

上下文:

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

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

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

我应该怎么做才能完成这项工作?

【问题讨论】:

  • 您的目标浏览器是否支持 JS getter 和 setter?
  • 不知道这些,谢谢@AnthonySottile,我会调查一下。
  • 为了可扩展性(稍后使用代码),您可能应该添加自己的方法(或函数),该方法(或函数)基于 text 属性的存在与否执行一个函数或只返回财产。这样文档的处理将始终调用相同的东西。

标签: javascript


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如果你不需要函数的外部参数,你可以在定义它之后执行,像这样:

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

    然后,调用后

    Element.text
    

    你会得到函数的返回值。

    【讨论】:

    • 这将是一个静态属性,如果元素发生变化,它不一定代表元素的内容。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2013-07-19
    • 2016-01-11
    • 2020-10-21
    相关资源
    最近更新 更多