2012-03-08 49 views
0

我正在使用mootools 1.4.3進行基本類繼承。我實際上是從一個不同的類庫轉換一些代碼。這個其他類庫會根據預定義的函數名稱模板動態創建getter和setter(成員函數_ 得到 _xxx將產生xxx的getter)。我想要做一些與mootools類似的東西。我對JavaScript並不陌生,但我對某些更高級的概念有些陌生。自動獲取/設置器

我已經完成了它的部分工作。在正在定義Class對象的代碼中,循環遍歷類參數並相應地添加defineGetterdefineSetter

http://jsfiddle.net/Qa2dr/1/

這個偉大的工程,它創造的getter和setter方法正確。失敗的地方是我創建一個孩子班的時候。這些動態獲取器/設置器不會傳播到子類。我不確定這是否可能,如果是的話,它是如何做到的。使用上述變化MooTools的類和這些類:

http://jsfiddle.net/vLyk7/10/

在日誌中富,我可以看到酒吧的getter和setter。在baz的日誌中,我可以看到quux的getter和setter,但我也想看到來自父級的getter和setter。再說一次,如果我能夠實現這一點,它將爲我節省很多時間來轉換此代碼。

+1

你能解釋一下你的用例嗎?有什麼可能的好處是沒有創建 - 自動 - 你的原型映射到特定屬性的函數?可能Class.Mutators是去這裏的地方,你可以聲明哪些變量應該接收一個getter/setter。 – 2012-03-08 16:21:18

+0

基本上,我正在使用一些現有的代碼,它具有__get__XXX和__set__XXX類型的函數,而不是在每個構造函數中添加__defineGetter__和__defineSetter__,我想改變MooTools爲我創建這些代碼。我的嘗試有點奏效,但生成的基類getter/setters不可用於子類。 – brandon 2012-03-08 16:30:33

回答

0

對。我覺得我得到你正在嘗試做的,但...

__defineGetter____defineSetter__已過時,不能跨瀏覽器:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Object/DefineSetter

保護和代理到這些屬性的直接訪問,當你擴展對象將無法正常工作因爲setter/getter(訪問新對象上的屬性)不會轉到您正在偵聽的父級(原型對象)。

你可以試試看Extends param。當你設置新的類時,從新的params對象中查找原型鏈中存在的函數,如果找到了匹配項,則應該將setter/getter也應用於新對象。這不是那麼容易...

我想說,大概在:newClass.prototype.parent = parent;你應該能夠檢查getter/setters是否已經變得可用並附加你的監聽器。您可能想要以某種方式保存參考,除非您想在此處檢查所有類屬性。

或者,您可以重構初始化類mutator w/o進入類型創建並追加你的東西 - 儘管原始對象可能不可用。