2013-06-27 60 views
2

當四處尋找模仿其他語言的私有方法,通常Crockford的頁面建議提出這個「priveleged」的方法:不是每個對象都重新創建的Javascript「priveleged」方法?

function Container(param) { 

    function dec() { 
     if (secret > 0) { 
      secret -= 1; 
      return true; 
     } else { 
      return false; 
     } 
    } 

    this.member = param; 
    var secret = 3; 
    var that = this; 

    this.service = function() { 
     return dec() ? that.member : null; 
    }; 
} 

所以service是priveleged - 它可以訪問私有方法(如dec)和私有變量(如secret)。我認爲它也可以調用「公共」方法(那些分配給Container.prototype的方法)。

但是,是不是service重新創建爲new Container的每個對象?是否需要額外的時間並消耗額外的內存?而私人的dec也是如此。

我瞭解,JS推薦的方式,使方法是KlassFunction.prototype避免這種性能問題。但是,可以用這種方式創建非公共方法嗎?

+0

你是絕對正確的。將它設置爲'prototype'將允許所有實例引用一個函數,而不是每個實例都重新創建它。但是就像你注意到的那樣,該方法將無法在構造函數中引用任何「私有」變量。這通常是一個權衡 – Ian

+1

沒有理由期望,*碼*作私人用途是重新創建每個構造函數被調用時。運行時(可能)會創建一個新的Function實例,但現代實現將能夠共享代碼。除非你創建了數以百萬計的對象,否則我認爲內存使用不應該成爲大問題。 – Pointy

回答

0

實在是2種私人。

  1. 這種私人嚴格執行在運行時。當然,這總是會有運行時間的損失。這裏使用private作爲安全機制。在Javascript中完全無用。

  2. 私人你的接口信號,該信號不很明顯在運行時執行的其他開發商。如果您想使用反射,您仍然可以訪問 字段。這裏使用private來防止意外濫用類內部。

如果我猜對了,你試圖通過做第一個目標來實現第二個目標。第二個目標可以簡單地按照慣例實現 ,並在構建步驟中執行這些約定。沒有必要將它帶入運行時。

內存使用(實際上壓在GC上)並不是唯一的問題,閉包類模式令人難以置信地不靈活,因爲您無法以任何方式重用,共享或繼承函數。即使出於臨時原因,您也無法訪問外部變量。還可以閱讀http://blog.jcoglan.com/2012/01/19/the-cost-of-privacy/

相關問題