js基礎(chǔ)知識(shí)(公有方法、私有方法、特權(quán)方法)
本文涉及的主題雖然很基礎(chǔ),在許多人看來(lái)屬于小伎倆,但在JavaScript基礎(chǔ)知識(shí)中屬于一個(gè)綜合性的話題。這里會(huì)涉及到對(duì)象屬性的封裝、原型、構(gòu)造函數(shù)、閉包以及立即執(zhí)行表達(dá)式等知識(shí)。
公有方法
公有方法就是能被外部訪問(wèn)并調(diào)用的方法。
// 在對(duì)象中 var Restaurant = { name: 'McDonald', // 公有方法 getName: function() { return this.name; } } // 在構(gòu)造函數(shù)中 function Person(name, age) { this.name = name; this.age = age; // 公有方法 this.getName = function() { return this.name; } } // 在原型中 Person.prototype.getAge = function() { return this.age; }
私有方法和特權(quán)方法
這兩個(gè)方法一般放在一起討論,原因在于我們定義的特權(quán)方法是指有權(quán)訪問(wèn)內(nèi)部私有屬性和私有方法的公有方法,而私有方法是指外部不可見(jiàn)且不可訪問(wèn)的方法。
通常定義一個(gè)對(duì)象的方式有二種,一是使用Object實(shí)例化或者對(duì)象表達(dá)式,二是使用構(gòu)造函數(shù)。同樣在不同的方式下面定義私有方法和特權(quán)方法的形式也不相同。
在對(duì)象中
這里我們通過(guò)Object對(duì)象表達(dá)式來(lái)創(chuàng)建一個(gè)對(duì)象并添加一些屬性和方法,然后直接采用靜態(tài)的方式調(diào)用。對(duì)象的私有數(shù)據(jù)放置在一個(gè)匿名函數(shù)立即執(zhí)行表達(dá)式(IIFE)中。這意味著這個(gè)函數(shù)只存在于被調(diào)用的瞬間,一旦執(zhí)行后就立即被銷(xiāo)毀了。
在對(duì)象中創(chuàng)建私有數(shù)據(jù)的方式在對(duì)象的模式(指創(chuàng)建對(duì)象的模式)中被稱(chēng)之為模塊模式,它的基本格式如下:
var yourObject = (function() { // 私有屬性和方法 return { // 公有方法和屬性 } }) ();
在模塊模式中,返回的對(duì)象字面量中只包含可以公開(kāi)的屬性和方法。
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
注意我們使用了閉包的方式來(lái)間接使用內(nèi)部私有變量,同時(shí)對(duì)餐廳(Restaurant)名(name)進(jìn)行了初始化。
在構(gòu)造函數(shù)中
在上面介紹的模塊模式創(chuàng)建私有方法時(shí),公有方法和特權(quán)方法并沒(méi)有什么本質(zhì)上的區(qū)別,原因在于這個(gè)概念是來(lái)自于使用構(gòu)造函數(shù)創(chuàng)建私有數(shù)據(jù)的時(shí)候定義出來(lái)的。
在構(gòu)造函數(shù)中定義私有屬性和方法很方便,我們不需要使用閉包,可以在調(diào)用的時(shí)候初始化數(shù)據(jù)。
function Restaurant(name) { // 私有屬性 var _total = 10; // 公有屬性 this.name = name; // 私有方法 function _buyFood() { _total--; } // 特權(quán)方法 this.buy = function() { _buyFood(); } this.getTotal = function() { return _total; } } // 公有方法, 注意這里不能訪問(wèn)私有成員_total Restaurant.prototype.getName = function() { console.log(_total); // Uncaught ReferenceError: _total is not defined return this.name; } var McDonald = new Restaurant('McDonald'); console.log(McDonald.getName()); // 'McDonald' McDonald.buy(); console.log(McDonald.getTotal()); // 9
合二為一,更加靈活的方式
使用模塊模式我們可以多次調(diào)用,每次執(zhí)行完后都會(huì)被銷(xiāo)毀掉。使用構(gòu)造函數(shù)方式可以傳入一些初始化的數(shù)據(jù),但在公有方法中無(wú)法訪問(wèn)到私有成員屬性,如果有很多公有方法需要訪問(wèn)私有數(shù)據(jù),我們?nèi)坑锰貦?quán)方法來(lái)寫(xiě),最后會(huì)給每個(gè)實(shí)例帶去很多沒(méi)有必要的方法。因此,將兩者結(jié)合在一起可以長(zhǎng)短互補(bǔ),結(jié)合方式也很簡(jiǎn)單
var Restaurant = (function() { // 私有屬性 var _total = 10; // 私有方法 function _buyFood() { _total--; } // 構(gòu)造函數(shù) 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
以上就是本文的全部?jī)?nèi)容,小編只是總結(jié)了其中一小部分,還有許多未提及到的知識(shí)點(diǎn),大家可以自己摸索研究,希望本文可以對(duì)初學(xué)者有所幫助。
- js類(lèi)中的公有變量和私有變量
- javascript入門(mén)基礎(chǔ)之私有變量
- javascript 動(dòng)態(tài)生成私有變量訪問(wèn)器
- JavaScript 模擬類(lèi)機(jī)制及私有變量的方法及思路
- 深入理解JavaScript中的塊級(jí)作用域、私有變量與模塊模式
- JavaScript面向?qū)ο笾接徐o態(tài)變量實(shí)例分析
- js面向?qū)ο笾小⑺接?、靜態(tài)屬性和方法詳解
- Javascript 構(gòu)造函數(shù),公有,私有特權(quán)和靜態(tài)成員定義方法
- javaScript 利用閉包模擬對(duì)象的私有屬性
- JavaScript私有變量實(shí)例詳解
相關(guān)文章
JS限制上傳圖片大小不使用控件在本地實(shí)現(xiàn)
文件上傳之前的檢測(cè),通常是通過(guò)文件名來(lái)判斷文件類(lèi)型是否合法,但是要想檢測(cè)文件的大小很難辦到,除非在本地或者使用控件。使用JS可以輕松解決詞問(wèn)題,本文詳細(xì)介紹,需要了解的朋友可以參考下2012-12-12IE6瀏覽器下resize事件被執(zhí)行了多次解決方法
在IE瀏覽器下,一次resize事件被執(zhí)行了多次,這是IE6和IE7的一個(gè)比較廣為認(rèn)知的問(wèn)題,這個(gè)問(wèn)題在這兩個(gè)版本的瀏覽器中表現(xiàn)有所不同,通常IE6下會(huì)比IE7下更為糟糕,接下來(lái)將介紹解決方法,需要的朋友可以參考下2012-12-12深入理解javascript中的立即執(zhí)行函數(shù)(function(){…})()
這篇文章主要介紹了深入理解javascript中的立即執(zhí)行函數(shù),立即執(zhí)行函數(shù)也叫立即調(diào)用函數(shù),通常它的寫(xiě)法是用(function(){…})()包住業(yè)務(wù)代碼,使用jquery時(shí)比較常見(jiàn),需要的朋友可以參考下2014-06-06js關(guān)于字符長(zhǎng)度限制的問(wèn)題示例探討
字符長(zhǎng)度限制在某些特殊的使用場(chǎng)合還是比較實(shí)用的,下面為大家用示例探討下,感興趣的朋友可以參考下2014-01-01JavaScript那些不經(jīng)意間發(fā)生的數(shù)據(jù)類(lèi)型自動(dòng)轉(zhuǎn)換
JavaScript可以自由的進(jìn)行數(shù)據(jù)類(lèi)型轉(zhuǎn)換,但是更多的情況下,是由JavaScript自動(dòng)轉(zhuǎn)換的。本文就將為大家詳細(xì)講解那些不經(jīng)意間發(fā)生的數(shù)據(jù)類(lèi)型轉(zhuǎn)換,感興趣的同學(xué)可以了解一下2022-02-02