js基础知识温习:Javascript中如何模拟私有方法
本文涉及的主題雖然很基礎,在很多人眼里屬于小伎倆,但在JavaScript基礎知識中屬于一個綜合性的話題。這里會涉及到對象屬性的封裝、原型、構造函數、閉包以及立即執行表達式等知識。
公有方法
公有方法就是能被外部訪問并調用的方法。
// 在對象中
var Restaurant = {name: 'McDonald',// 公有方法getName: function() {return this.name;}
}// 在構造函數中
function Person(name, age) {this.name = name;this.age = age;// 公有方法this.getName = function() {return this.name;}
}// 在原型中
Person.prototype.getAge = function() {return this.age;
} 私有方法和特權方法
這兩個方法一般放在一起討論,原因在于我們定義的特權方法是指有權訪問內部私有屬性和私有方法的公有方法,而私有方法是指外部不可見且不可訪問的方法。
通常定義一個對象的方式有二種,一是使用Object實例化或者對象表達式,二是使用構造函數。同樣在不同的方式下面定義私有方法和特權方法的形式也不相同。
在對象中
這里我們通過Object對象表達式來創建一個對象并添加一些屬性和方法,然后直接采用靜態的方式調用。對象的私有數據放置在一個匿名函數立即執行表達式(IIFE)中。這意味著這個函數只存在于被調用的瞬間,一旦執行后就立即被銷毀了。
在對象中創建私有數據的方式在對象的模式(指創建對象的模式)中被稱之為模塊模式,它的基本格式如下:
var yourObject = (function() {// 私有屬性和方法return {// 公有方法和屬性}
}) (); 在模塊模式中,返回的對象字面量中只包含可以公開的屬性和方法。
var Restaurant = (function() {// 私有屬性var _total = 10;// 私有方法var _buyFood = function() {_total--;};var _getTotal = function() {return _total;}return {name: 'McDonald',getTotal: _getTotal,buy: _buyFood}
}) ();Restaurant.buy();
console.log(Restaurant.name); // 'McDonald'
console.log(Restaurant.getTotal()); // 9 注意我們使用了閉包的方式來間接使用內部私有變量,同時對餐廳(Restaurant)名(name)進行了初始化。
在構造函數中
在上面介紹的模塊模式創建私有方法時,公有方法和特權方法并沒有什么本質上的區別,原因在于這個概念是來自于使用構造函數創建私有數據的時候定義出來的。
在構造函數中定義私有屬性和方法很方便,我們不需要使用閉包,可以在調用的時候初始化數據。
function Restaurant(name) {// 私有屬性var _total = 10;// 公有屬性this.name = name;// 私有方法function _buyFood() {_total--;}// 特權方法this.buy = function() {_buyFood();}this.getTotal = function() {return _total;}
}// 公有方法, 注意這里不能訪問私有成員_total
Restaurant.prototype.getName = function() {console.log(_total); // Uncaught ReferenceError: _total is not definedreturn this.name;
}var McDonald = new Restaurant('McDonald');
console.log(McDonald.getName()); // 'McDonald'
McDonald.buy();
console.log(McDonald.getTotal()); // 9 合二為一,更加靈活的方式
使用模塊模式我們可以多次調用,每次執行完后都會被銷毀掉。使用構造函數方式可以傳入一些初始化的數據,但在公有方法中無法訪問到私有成員屬性,如果有很多公有方法需要訪問私有數據,我們全部用特權方法來寫,最后會給每個實例帶去很多沒有必要的方法。因此,將兩者結合在一起可以長短互補,結合方式也很簡單
var Restaurant = (function() {// 私有屬性var _total = 10;// 私有方法function _buyFood() {_total--;}// 構造函數function restaurant(name) {this.name = name;this.getTotal = function() {return _total;}}restaurant.prototype.buy = function() {console.log(_total); // 10_buyFood();}restaurant.prototype.getName = function() {return this.name;}return restaurant;
}) ();var McDonald = new Restaurant('McDonald');
console.log(McDonald.getName()); // 'McDonald'
McDonald.buy();
console.log(McDonald.getTotal()); // 9 總結
這個主題說實話,知識點遠遠不止這一點,但作者本人項目經驗太少,文字功底太弱,很多東西不知道怎么描述。湊合著看一下,希望對新手有些幫助。
參考
-《JavaScript高級程序設計》(第3版)
-《JavaScript面向對象精要》
-《Effective JavaScript》
- Private Members in JavaScript
- JavaScript private methods
- AGAIN WITH THE MODULE PATTERN – REVEAL SOMETHING TO THE WORLD
轉載于:https://www.cnblogs.com/wujie520303/p/4941228.html
總結
以上是生活随笔為你收集整理的js基础知识温习:Javascript中如何模拟私有方法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 养老院一个月多少钱啊?
- 下一篇: .net下WinDbg使用说明