2012-07-29 90 views
1

我想用一个函数覆盖一个对象属性,以便每当调用该对象的属性时,它都会调用该函数并返回结果。用函数覆盖一个Javascript属性

当然,这应该是可能的动态语言,如JS?

语境:

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

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

不起作用,因为当代码库是“myelem.text”,它并不真正运行的功能,它只是返回一个指针。

我该怎么做才能做到这一点?

+0

您的目标浏览器是否支持JS getters和setters? – 2012-07-29 00:22:52

+0

不知道这些,谢谢@AnthonySottile我会研究它。 – Leor 2012-07-29 00:44:36

+0

对于可伸缩性(稍后使用代码),您应该添加您自己的方法(或函数),它基于'text'属性的存在或不存在来执行函数或仅返回属性。这样处理文档总是会调用相同的东西。 – Sherbrow 2012-07-29 01:52:09

回答

1

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

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

工作正常。谢谢! – Leor 2012-07-29 05:25:03

0

如果不需要外部函数的自变量,可以定义后执行,就像这样:

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

然后调用

Element.text 

后,你会得到返回值从功能。

+0

这将是一个静态属性,如果该元素曾被更改,则该属性不一定代表元素的内容。 – jfriend00 2012-07-29 02:18:04