它需要多少內存取決於引擎,但它必須存儲閉包以及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
私人所有,但它並使用你的代碼告訴任何人,他們不該不會訪問他們。如果他們太愚蠢而不是破壞一切,那不再是你的問題了。
當然,它使用更多的存儲空間,因爲對象具有檢索不需要的值的功能。並且訪問速度會比較慢,因爲函數調用比直接屬性訪問具有更多開銷。但是,這是否會對性能產生實際影響是一個更重要的問題。 – RobG
@RobG - 我傾向於擔心諸如鼠標移動事件處理程序之類的對象分配問題,確實試圖避免讓GC中斷拖動或類似的東西。我不擔心函數調用的成本。 – obelia