他們堅信有一點,如果你建立一個屬性對象,或者建立三維全域變數,這是任何人都公平的遊戲。然而,一些非常簡單的模式,你可以使用JavaScript來保護在訪問一個給定的對象或變數的私人!
Classes
你可能知道在JavaScript中是不存在真實的類的,但使用功能和原型,我們可以類比非常好。使用這種模式,你也可以類比私人變數:
function MyClass(parameter) { // Create the private var var privateVar = 8, self = this; self.parameter = parameter // Function that handles the private function handlePrivate() { return privateVar ? privateVar-- : false; } // Public method that calls the handler // Returns parameter until it's been accessed 8 times this.getPrivate() { return handlePrivate() ? self.parameter : null; }}
私人的建立通過構建函數,而且也只能通過構建函數建立,添加了特別的存取方法來訪問私人屬性,在以上樣本中,值只有通過特定的方法訪問。
Closures
模式圍繞一個變數範圍關閉,返回一個對象或函數來訪問變數。這是一個簡單的例子:
var accessor = (function() { // Create the private var var privateVar = "You Can't See Me, "; // Some other functionality here that periodically changes privateVar, because it has access to it // [ more code here ] // Return the accessor return function(name) { return privateVar + name; };})();// Use!// currentValue = accessor("David"); "You Can't See Me, David"
privatevar變數不可用外關閉,所以沒有辦法直接存取的。我們這樣做,然而,能夠變回從閉合有一個定義函數。因此,變數保持私密,你可以訪問它的值,但不允許直接存取。你也可以返回修改受保護物件變數的方法:
var accessor = (function() { // The "private" var val = 9; // An object for getting and setting return { get: function() { return val * 3; }, set: function(s) { val = s; } };})();
當然,以上的模式,使用者可以重新獲得類似的方法:
accessor = function(n) { return "My custom string, " + n; }
通常所有的功能處理私人資訊處於封閉,防止使用者重寫方法的問題。像這樣的東西:
var accessor = (function() { var permissions = {}; function handleResult(perm) { // Do something with the result } return function(permissionToCheck, callback) { if(permissions[permissionToCheck]) != undefined) { callback(permissions[permissionToCheck]); } else { $.post({ url: "/permissions" data: { perm: permissionToCheck } }).success(function(res) { callback(handleResult(res)); }); } }; })();
在JavaScript簡單一定美,不把它寫下來,因為它不提供相同的顯式結構為其他語言