2012-07-29 71 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