2013-05-10 38 views
1

好吧,下面給出Javascript代碼,我不想修改:在對象的原有範圍調用功能

(function() { 

    function iWantToCallThis(){ 
     // Do some stuff 
    } 

    window.SomeObject = { 

     theirfunc = function(){ 
      // Do some stuff 
     }, 

     otherFuncIDontWantToCall = function(){ 
      // This works, but don't want to call this function. 
      iWantToCallThis(); 
      // does other stuff 
     } 

    } 

}()); 

如何訪問iWantToCallThis()通過SomeObject的範圍,像這樣:

window.SomeObject.theirfunc = (function (func){ 
    iWantToCallThis(); 
    func.apply(this, arguments); 
} (win.SomeObject.theirfunc)); 

即使我認爲該功能在技術上運行在其原始範圍內,但我無權訪問iWantToCallThis()。有沒有辦法在不編輯原始源代碼的情況下訪問該功能?

謝謝!

+0

你不能。 'iWantToCallThis'是本地執行您的自我執行匿名功能。這不是一個財產。 – Blender 2013-05-10 21:35:13

+0

恕我直言,Douglas Crockford的「[JavaScript中的私人成員](http://javascript.crockford.com/private.html)」是關於此主題的權威性文章。它應該有助於說服你,除了通過特權方法之外,私人成員是外部無法訪問的。 – 2013-05-12 01:15:05

+1

偉大的文章@甜菜根 - 甜菜根,介意發佈作爲答案,我會接受它?絕對可以更好地深入解釋我遇到的情況。 – MatthewKremer 2013-05-13 13:21:26

回答

1

馬修,

恕我直言,道格拉斯·克羅克福德的「Private Members in JavaScript」這個主題的權威性文章。

它應該有助於說服你,除了通過特權方法,私人成員是外部無法訪問的。

0

不,因爲iWantToCallThis既不是從IIFE返回的,也不是存儲在像SomeObject這樣的公共命名空間/變量中,它們的屬性是。

如果當然,你可以做的事情,就像你在第二塊中開始做的那樣,是手動重現該函數的內容並重新聲明它。儘管由於其範圍,無法自動獲取函數的內容。

+0

不幸的是,我不能重現的內容,因爲該功能改變其他「非範圍」變量:( – MatthewKremer 2013-05-10 21:36:53

+0

哦,那你的答案然後:) – Kristian 2013-05-10 21:37:56

1

簡短的回答是,你不能。

長的回答是,如果您改變主意不改變代碼,然後返回iWantToCallThis,您可能最終會關閉。如果你做了很多,你可能會遇到性能問題。

+0

我已經通過修改第三方源代碼,但我不想訴諸於此,因爲我試圖讓我所有的「黑客」不直接修改源代碼。如果有人用新版本更新源文件,hack將會消失,而不是處於單獨的文件中。 – MatthewKremer 2013-05-10 21:38:23

+0

好點。這個第三方軟件是一個已知的JS框架嗎? – Renan 2013-05-10 21:39:50

+0

是的,它是HighCharts。所以它很可能會經常更新。 – MatthewKremer 2013-05-10 21:49:27