2012-09-16 53 views
5

所以我創造了這樣的功能,創建JavaScript函數的自定義原型

var functionName = function(arg1) { //code logic here; } 

與此同時,我需要這個功能作爲一個對象來工作。它不會真的保存任何東西,但數據將從另一個對象訪問。

var myObj = new Object(); 
myObj.x = 3; 
myObj.y = 4; 

所以,當我走了,functionName.x它應該返回myObj.xmyObj對象正在其他地方維護,我沒有任何控制權。

這是怎樣我現在實現了它,

functionName.__proto__ = myObj; 

它工作正常。但__proto__已被棄用,我想看看是否有任何其他安全的方式來做到這一點。我想覆蓋Function.prototype但它不起作用。

+0

爲什麼你不只是存儲在** functionName **只是對** myObj **的引用? – Kryz

+0

@Kryz我不確定我明白了,我不能做functionName = myObj cuz,它會覆蓋函數定義。目前,functionName被作爲functionName()和functionName.x訪問,所以我需要維護這個行爲。 –

+0

一個備註:myObj應該可以從Function.prototype派生,這樣你仍然可以訪問到functionName.bind等等(當然,這與原始問題無關)。 – Marc

回答

1

你想實現一個委託MyObj中:

 var functionName = function(arg1) { // code } 

    functionName.myObj = new MyObj(); 
    for (prop in functionName.myObj) { 
     if (functionName.myObj.hasOwnProperty(prop)) { 
     functionName.__defineGetter__(prop, function() { return functionName.myObj[prop]; }); 
     } 
    } 
+0

我在這裏看到的是每次functionName()被稱爲函數,它會遍歷myObj中的每個項目。這可能會很慢。該對象可以包含多達500個元素。而且,如果functionName()永遠不會被調用,那麼getters將不會被定義。例如,有些頁面會直接使用functionName.x而不使用functionName() –

+0

我假設functionName是一個構造函數。更新正常功能的答案。 –

+0

我認爲這裏缺少一點。 myObj已經在某個地方定義並保存了一組動態的對象。意思是,它可能在運行時失去或獲得更多元素。我不能將內容複製到functionName,因爲一旦myObj得到更新,那麼它不會與functionName同步。我需要functionName或其原型來保存對myObj的引用。這工作時,我做functionName .__ proto__ = myObj但我需要找到替代__proto__使用, –

-1

您可以設置功能的prototype

function functionName(arg1) { 
    //code logic here; 
} 

var myObj = { x: 3, y: 4 }; 
functionName.prototype = myObj; 

var obj = new functionName(); 
console.log(obj.x, obj.y); // will output 3, 4 
+0

我需要從函數名直接訪問這些。 functionName()和functionName.x的使用遍佈在不同的頁面上,並且不足以改變每一個頁面。 –

+1

這根本不回答OP的問題。 OP想用自定義的__proto__創建一個函數。這並不是那樣做的。因此它應該被刪除。 –

1

我在這裏遇到同樣的問題。不幸的是,在EcmaScript 5.1下沒有好的解決方案。

在語言規範http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf它在13.2「創建函數對象」中說,新創建的函數對象的[[Prototype]]內部屬性始終是標準的內置函數原型對象。

如同13.3中詳細描述的那樣,使用Function構造函數也沒有幫助,因爲由new Function(…)構造的函數也使用13.2中詳述的方法。 (這是由事實,Functionprototype屬性是可寫的也不是配置既不反映。

因此,要達到你想要什麼,你需要一種方法來改變現有對象的原型。幸運的是,即將到來的ECMAScript 6標準似乎標準Object.prototype.__proto__根據近期草案http://wiki.ecmascript.org/lib/exe/fetch.php?id=harmony%3Aspecification_drafts&cache=cache&media=harmony:working_draft_ecma-262_edition_6_05-14-13-nomarkup.pdf附錄B.2.2。