2015-11-14 27 views
0

說,我想用2場,一個b對象:簡單對象與關閉Javascript的存儲大小

function createObject (a, b) { 
    return { a: a, b: b }; 
} 

但是,如果我想控制訪問,比如讓用戶只讀,我可以使用關閉:

function createObject (aParam, bParam) { 
    var a = aParam, b = bParam; 
    return { 
     a: function() { return a; }, 
     b: function() { return b; } 
    } 
} 

關閉方法需要多少額外的存儲空間?以這種方式創建的每個對象是否擁有這兩種訪問函數的唯一副本?

+1

當然,它使用更多的存儲空間,因爲對象具有檢索不需要的值的功能。並且訪問速度會比較慢,因爲函數調用比直接屬性訪問具有更多開銷。但是,這是否會對性能產生實際影響是一個更重要的問題。 – RobG

+0

@RobG - 我傾向於擔心諸如鼠標移動事件處理程序之類的對象分配問題,確實試圖避免讓GC中斷拖動或類似的東西。我不擔心函數調用的成本。 – obelia

回答

2

它需要多少內存取決於引擎,但它必須存儲閉包以及getter方法,這些方法會爲每個創建的新實例都複製。它還會減慢執行速度,因爲每次訪問變量時都需要運行該方法,並且使代碼不易讀(當需要使用時,需要調用.a()而不是.a)。

,因爲沒有什麼可以阻止有人做這個替換值我不會用這樣的:

obj = createObject('original', 'values'); 
obj.a(); // returns 'original' 

obj.a = function() { return 'modified'; }; 
obj.a(); // returns 'modified' 

順便說一句,把參數名在括號中是一樣的聲明函數體內的變量。換句話說,你不需要在你的代碼中有paramA和paramB。這個工程只是罰款:

function createObject (a, b) { 
    return { 
     a: function() { return a; }, 
     b: function() { return b; } 
    } 
} 

有保障的JS變量,不會引起可怕的開銷,沒有完美的辦法,所以最好的辦法就是把一個下劃線前綴或後綴的專用屬性以下劃線,就像在蟒蛇。我更喜歡使用前綴,所以當有人使用我製作的庫時,私有變量不會顯示在自動完成中。然後,你可以實際代碼原型,吸氣,所以只有一個方法的副本:

function Foo(a, b) { 
    this._a = a; 
    this._b = b; 
} 

Foo.prototype.getA = function() { return _a; }; 
Foo.prototype.getB = function() { return _b; }; 

這並不讓_a_b私人所有,但它並使用你的代碼告訴任何人,他們不該不會訪問他們。如果他們太愚蠢而不是破壞一切,那不再是你的問題了。

+0

謝謝。那裏有一些好的提示。 – obelia