這不破壞封裝嗎?
是和否。如果使用閉包,則仍然可以擁有「私有」變量,因爲它們不能在實例化時聲明的對象函數之外訪問。例如:
var ObjectPrototype = function() {
var privateVariable = "closure-scope value";
var InnerPrototype = function() {
this.getPrivate = function() { return privateVariable; };
};
return new InnerPrototype();
};
var myObject = new ObjectPrototype();
由於ObjectPrototype
返回InnerPrototype
的一個新實例,和privateVariable
僅存在於ObjectPrototype
閉合,就沒有辦法直接從外部訪問privateVariable
。獲得它的價值的唯一方法是通過myObject.getPrivate()
。注意:Javascript通過引用傳遞對象和數組,所以此方法只能真正保護簡單的值(除非您小心地返回克隆)。
如果程序的其他部分不斷添加新屬性會怎樣? 如何讓我的對象創建體積龐大?
這是你需要留意的東西。
如果有人刪除/修改了我定義的屬性會怎麼樣?
使用上述封閉範圍方法來防止這種情況。
如果我不使用嚴格模式,即使在freeze()之後,我也可以添加/刪除嗎? – WinOrWin
@WinOrWin - 如果不是在嚴格模式下,代碼將會運行,但不會發生任何事情。所以他們可以儘可能多地寫'o.c = 3',但'o'仍然會保持原樣。 – ChaosPandion