亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > JS > 正文

javascript面向對象三大特征之封裝實例詳解

2024-05-06 16:53:33
字體:
來源:轉載
供稿:網友

本文實例講述了javascript面向對象三大特征之封裝。分享給大家供大家參考,具體如下:

封裝

封裝(Encapsulation):就是把對象內部數據和操作細節進行隱藏。很多面向對象語言都支持封裝特性,提供關鍵字如private來隱藏某些屬性和方法。要想訪問被封裝對象中的數據,只能使用對象專門提供的對外接口,這個接口一般為方法。調用該方法能夠獲取對象內部數據。

在JavaScript語言中沒有提供專門的信息封裝關鍵字,不過可以使用閉包來創建,只允許從對象內部訪問的方法和屬性。另外,接口也是數據封裝的一種工具,接口提供了外界訪問方法的約定。在應用開發中,所有類都應定義接口,類只向外提供已實現接口中規定的方法,任何別的方法都是隱藏的。其所有屬性都是私有的,外界只能通過接口中定義的存取操作與之打交道。

---引自 《jQuery開發從入門到精通》,不過原書有錯誤,或者可能是我錯買了盜版,不過下面代碼都是經過我修改的,沒有問題。

被動封裝

被動封裝:就是對對象內部數據進行適當約定,這種約定具有很強的主觀性,沒有強制性保證,主要針對公共對象而言。一般來說,JavaScript所包含的數據都是公開的,沒有隱私可言,其中的信息可以隨意被訪問。下面給出一個例子來闡述:

var Person = function (name,gender) { if(name === undefined) {  throw new Error("name is necessary") } else {  this.name = name; } if(gender === undefined) {  throw new Error("gender is necessary") } else {  this.gender = gender; }}var p = new Person("Tom",1); // 如果我們實例化的時候,如果傳遞參數錯誤了,將會報異常

為了數據安全,代碼中適當的增加了一些條件限制,避免非法信息侵入。

var Animal = function (species) { if(!this.checkSpecies(species)) {  throw new Error('species is illegal'); } else {  this.species = species; }}Animal.prototype = { checkSpecies:function(species){  // 檢測 species , 參數為 species , 合法返回true ,這里可自定義檢測邏輯  // 這里先讓它直接返回 true  return true; }}var ani = new Animal("dog");

從更安全和擴展的角度來說,凡是類都應該定義接口,這樣能夠保證數據存取更加安全,同時也方便團隊的合作。內部私有方法檢測和接口措施可在一定程度上保護對象內部數據,但是他們也存在一個致命漏洞(這些屬性和方法可以被公開重置,面對公開覆蓋屬性和方法值,任何人都無法阻止這種行為。),比如這樣的:

var Util = function() {};Util.prototype = { _say:function(){  console.log("這里有一個私有的成員 _say方法"); }}// 下面我們來修改它Util.prototype._say = function(){ console.log('哈哈,我已經被修改了');}// 開始檢測var util = new Util;util._say(); // 哈哈,我已經被修改了

同時內部檢測和接口可以在一定程度上占用了系統開銷,這個問題也是必須認真考慮的。

就像上面的代碼那樣,一般我們約定了區別公共和私有成員,就是在一些方法和屬性名稱前或者后加下劃線,來表示私有。

下劃線命名是一種約定俗稱的命名規范,表示一個屬性和方法僅供內部使用,直接訪問可能會導致意外發生。

以上數據保護方式都是被動性防御,因為他們只是一種約定,只有在遵守的時候才有效果。主要適用于非敏感性的內部方法和屬性。

主動封裝

在js中,因為函數有作用域,在函數內部聲明的變量,在函數外部無法訪問。而所以的私有和公有的區別就在于在對象外部是否可以訪問。所以實現封裝的最佳選擇是使用函數的作用域。舉例:

function haha() { var n = 1; function hehe() {  n++; } hehe(); return n;}console.log(haha()); // 2

函數haha內部有私有變量n,在此作用域中,hehe能夠訪問n,而haha外部的任何函數都無法訪問haha里的n。

同樣的,我們在函數內部返回hehe,就可以在外部來調用haha私有函數hehe。

function haha() { var n = 1; function hehe() {  return ++n; } return hehe;}console.log(haha()()); // 2

函數作用域內部的方法無法被外界訪問,但是在函數作用域內部的其他公共方法可以訪問到它們,于是利用公共方法為中轉站,可以巧妙的把內部私有方法公開化。因此這些公共方法也被稱為特權方法,即在方法前面加this關鍵字。

使用這種方式創建的對象具有真正的封裝性如:

function A() { // 私有方法 _xx function _xx(){} // 公有方法 this.xx = function() {  return _xx; }}A.prototype = { other:function() {  console.log("other方法代表不需要訪問私有屬性和方法的方法,一般放在原型里"); }}

但是這種方式也有一些缺點:

① 新生成的每個實例對象都會拷貝構造函數中的屬性和方法,而私有的_xx 無疑在每次實例化的時候都會重復拷貝,這樣會占用大量內存,所以不適合大量使用,僅在必要時適當使用

② 不利于類的繼承,所有派生的子類都不能訪問超類中的私有屬性和方法。不過可以使用特權方法來訪問超類中的私有屬性和方法。舉個例子:

// B 是超類function B() { var _private = 1; function _checkPrivate() {  return _private; } this.checkPrivate = function() {  return _checkPrivate; }}// C 是派生類function C() { B.call(this); // 用call 實現繼承 ,后面我們會講到如何繼承 // this.private = _private; // 這里嘗試訪問超類的私有屬性,因為無法訪問,會報錯}// 實例化 派生類Cvar c = new C();// console.log(c.private); // 和在C內部的嘗試一樣,是無法訪問的,報錯// 不過可以用下面的方法訪問超類中的私有屬性console.log(c.checkPrivate()()); // 1

靜態方法

在面向對象編程中,大多數的方法和屬性與類的實例產生聯系。還有一種情況是,靜態屬性和方法是與類本身直接聯系,可直接從類訪問,也就是說,靜態成員在類上操作,而不是實例上。在JavaScript中的Math和Global都是靜態對象,不需要實例化就可直接訪問。

類的靜態成員,包括私有和公共兩種。他們在系統中只有一份副本,意思就是說他們不會被分成多份傳遞給不同的實例對象。而是通過函數指針進行引用。書上有個例子非常好,下面舉例:

var F = (function(){ // 把閉包函數賦給F,返回一個構造函數 var _a = 1; // 定義一個閉包體內的私有變量 this.a = _a; // 閉包體內的公共屬性 a this.get1 = function(){ // 閉包體內的公共方法get1  return _a; } this.set1 = function(x){ // 閉包體內的公共方法set1  _a = x; }; return function(){ // 返回一個構造函數,構造函數也是函數,更是對象(相當于一個類)  this.get2 = function() { // 類的get2方法   return _a;  };  this.set2 = function(x) { // 類的set2方法   _a = x;  }; }})();// 定義類的靜態公共方法和屬性F.get3 = function(){ // 定義一個靜態方法get3 return get1(); // 這里可以直接使用 F內的公共方法get1}F.set3 = function(x) { // 定義一個靜態方法set3 return set1(x); // 同get1}// 下面開始測試var f = new F(); // 實例化這個類console.log(f.get2()); // 1 用實例對象訪問公共方法get2F.set3(3); // 調用靜態方法set3console.log(F.get3()); // 3F.A = ++a; // 定義一個靜態屬性Aconsole.log(F.A); // 2

我們推薦使用這種閉包的封裝方式

希望本文所述對大家JavaScript程序設計有所幫助。


注:相關教程知識閱讀請移步到JavaScript/Ajax教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久99精品国产99久久6尤物| 九色成人免费视频| 国a精品视频大全| 亚洲成人精品视频在线观看| 欧美日韩亚洲成人| 富二代精品短视频| 日韩在线观看你懂的| 成人免费网站在线看| 日韩av在线免费| 欧美午夜片欧美片在线观看| 久久视频在线直播| 亚洲精品中文字幕女同| 欧美大片欧美激情性色a∨久久| 国产成人在线一区| 搡老女人一区二区三区视频tv| 国产精品久久不能| 国内精品久久久久久| 69视频在线免费观看| 欧美成人激情视频免费观看| 久久夜色精品亚洲噜噜国产mv| 成人信息集中地欧美| 欧美孕妇孕交黑巨大网站| 亚洲人成在线观看网站高清| 亚洲自拍偷拍一区| 亚洲一区亚洲二区亚洲三区| 国产精品久久久久久久久久久久久| 亚洲国产精品久久久久秋霞不卡| 亚洲区在线播放| 国产成人高清激情视频在线观看| 色综合色综合久久综合频道88| 97久久精品人搡人人玩| 国产一区二区香蕉| 日韩av在线一区| 亚洲欧美在线免费| 91免费看片在线| 热久久免费视频精品| **欧美日韩vr在线| 国产脚交av在线一区二区| 国产亚洲a∨片在线观看| 欧美中文在线观看国产| 茄子视频成人在线| 久久天天躁日日躁| 57pao成人国产永久免费| 亚洲欧美福利视频| 欧美亚洲在线播放| 国产最新精品视频| 国产精品入口福利| 欧美另类69精品久久久久9999| 欧美激情中文网| 日韩激情第一页| 国产午夜精品理论片a级探花| 一区二区三区四区视频| 国产精品专区第二| 精品亚洲男同gayvideo网站| 国产精品午夜视频| 国产精品无码专区在线观看| 亚洲人成欧美中文字幕| 亚洲日本成人女熟在线观看| 欧美日韩一二三四五区| 成人黄色av播放免费| 成人免费观看网址| 日韩高清有码在线| 97久久精品视频| 国产91网红主播在线观看| 日韩精品在线观看一区二区| 91精品国产综合久久久久久蜜臀| 一本色道久久综合亚洲精品小说| 亚洲v日韩v综合v精品v| 欧美国产日产韩国视频| 在线观看国产精品淫| 色yeye香蕉凹凸一区二区av| 日本成人黄色片| 日韩av网站电影| 国产婷婷色综合av蜜臀av| 日韩精品久久久久久久玫瑰园| 国产精品亚洲美女av网站| 日韩在线免费观看视频| 一本色道久久88亚洲综合88| 久久国产精品久久久久久| 中文字幕欧美在线| 亚洲免费中文字幕| 国产91ⅴ在线精品免费观看| 亚洲欧美制服中文字幕| 日韩少妇与小伙激情| 欧美在线观看网址综合| 伊人亚洲福利一区二区三区| 久久久久久久久久久久久久久久久久av| 九九九热精品免费视频观看网站| 成人黄色大片在线免费观看| 中文国产成人精品| 国产精品高潮呻吟久久av黑人| 欧美成人免费全部| 18性欧美xxxⅹ性满足| 国产精品精品久久久| 国产精品男人爽免费视频1| 国自产精品手机在线观看视频| 中文字幕日韩在线观看| 欧美日韩亚洲一区二| 欧美性生交xxxxx久久久| 欧美成人亚洲成人日韩成人| 精品中文字幕视频| 久久免费国产精品1| 久久久精品免费视频| 久久91亚洲精品中文字幕| 国产精品久久久久久久久久东京| 久久免费观看视频| 成人有码视频在线播放| 欧美日韩中文字幕| 日韩av综合网站| 精品国产一区二区三区久久狼黑人| 精品国产美女在线| 国产精品美女主播| 精品久久久久久亚洲国产300| 欧美国产中文字幕| 中文字幕日韩电影| 亚洲人成伊人成综合网久久久| 国产成人综合精品在线| 国产精品一区二区三区毛片淫片| 日韩亚洲欧美中文在线| 久久天堂av综合合色| 亚洲男人第一网站| 91美女福利视频高清| 国产精品网站大全| 国产精品日韩专区| 国产精品久久久久久久美男| 亚洲欧美国产精品专区久久| 国产不卡av在线| 国产午夜一区二区| 精品欧美一区二区三区| 久久久久久亚洲| 亚洲精品www久久久久久广东| 欧美激情一区二区三区高清视频| 91tv亚洲精品香蕉国产一区7ujn| 成人黄色午夜影院| 久久精品久久精品亚洲人| 欧美在线观看www| 国产精品aaaa| 成人av番号网| 久久久久久成人| 国产成人精品优优av| 91久久国产精品91久久性色| 另类专区欧美制服同性| 午夜精品美女自拍福到在线| 在线观看国产成人av片| 成人国产亚洲精品a区天堂华泰| 92版电视剧仙鹤神针在线观看| 在线成人中文字幕| 亚洲黄页网在线观看| 91色琪琪电影亚洲精品久久| 少妇高潮久久久久久潘金莲| 亚洲成人网在线| 久久99国产精品自在自在app| 欧美大荫蒂xxx| 日韩视频免费观看| 日韩动漫免费观看电视剧高清| 亚洲成人久久久| 久久人人看视频| 成人在线视频网站| 热99精品只有里视频精品| 日韩黄色在线免费观看| 久久九九有精品国产23| 国产精品夫妻激情| 久久深夜福利免费观看| 中文字幕精品在线|