本文分上下兩部分,上部講基本模式(basic patterns):完全暴露法,下劃線標記法和使用閉包;下部講高級模式(Advanced Patterns),如何實現靜態方法和屬性,常量還有其他一些知識點。
封裝是物件導向語言很基本也是很有用的特性,雖然javascript也可以稱的上是物件導向語言,但他對封裝的支援並不是很好,不像其他語言,只要使用private、protected就可以實現。但這並不是說就沒有辦法了,下面我就介紹下如何在javascript中實現封裝。
一、基本模式(basic patterns),主要包括三種方式:完全暴露法,下劃線標記法和使用閉包。 (閉包是個很重要,也是很難的概念,有興趣的朋友可以上網找資料,我部落格也轉載了別人的文章)。
這裡我們以book類別作為例子,需要建立和初始化book類別。
// Book(isbn, titled >var theHobbit = new Book('0-395-07122-4', 'The Hobbit', 'J. R. R. Tolkien');
theHobbit.display(); // Outputs the data by creating and populating an HTML element.
建立book類可以用最傳統的建構子方式,
程式碼如下:
var Book = function(isbn, title, author) {
if(!this.checkIsbn(isbrn)) throw :) th. Invalid ISBN.');
this.isbn = isbn;
//代碼中|| 的作用是如果title無值,則會把'No title specified'賦給this.title。這種方式很好用,大家可以在自己的程式碼中使用。
this.title = title || 'No title specified';
this.author = author || 'No author specified';
}
Book.prototype = { 〔〜/ isbn函數
checkIsbn: function(isbn) {
...
},
/取得isbb> },
/取得isbn },
//設定isbn
setIsbn: function(isbn) {
if(!this.checkIsbn(isb )) throw if(!this.checkIsbn(isb )) throw Book this. isbn = isbn;
},
//取得title
getTitle: function() {
/tled 🎜> setTitle: function(title) {
this.title = title || 'No title specified';
},
//獲取作者 },
//設置作者
setAuthor: function(author) {
this.author = author || 'No author specified';
},
//顯示函數
display: function() {
...
}
};
下有點簡單,這裡有點簡單解 。 javascript中創建類別和c#,java有點不同,c#,java會把所有方法和屬性包在一個類別文件裡面,比如說
複製程式碼
{
this.isbn=value;
}
get }
}
...
private bool CheckIsbn (string isdn)
{
......
}
......
public void Display()
{
..... .
}
}
javascript也可以用這種方式,但是推薦使用我上面使用的把屬性定義到類別定義函數(或者叫構造函數),方法定義到prototype物件中,這種做法性能要好些,至於原因大家可以去google。
上面的js程式碼想實現的功能是,定義一個book類,類裡麵包括三個私有變數(或者叫屬性)isbn,title,author,一個私有方法checkIsbn,幾個公有方法getIsdn,setIsdn,. ..display。想法是好的,但是現實是殘酷的,其實那些私有屬性或方法根本一點都不私有。比如說,theHobbit.isbn = '978-0261103283';你可以用這種方式為isbn賦值,不會報錯而且絕對成功。原因就是javascript沒有private方式去實現對特定物件的私有化。此外這種實作方式在使用時也會造成困惑,到這類的創建者想揭露哪些屬性和方法呢?以下介紹第一種改進方法,底線標記法。
2.下劃線標記法:
var Book = function(isbn, title, author) {
// Constructor code.
this.setIsbn(isbn);
this.setTitle(title);
Book.prototype = {
//驗證isbn函數
_checkIsbn: function(isbn) { 〜 〜〜 isbn
getIsbn: function() {
return this._isbn;
}, n) {
if(!this._checkIsbn(isbn)) throw new Error ('Book: Invalid ISBN.');
this._isbn = isbn; 『顯示函數
display: function() {
. ..
}
};
其實就是在所有想實現私有的屬性或者方法前面加了下劃線_,沒別的操作。這種方法並沒有實現真正的私有化,theHobbit._isbn = '978-0261103283';這樣操作照樣成功,這種方式最大的意義在於告訴類的使用者,作者本意上想暴露哪些對象,不想暴露哪些。但是使用者是否按照作者的想法去做,作者是控制不了的。
那有沒有辦法實現真正的私有化呢,答案是有的,就是利用閉包。
3.使用閉包:
javascript之所以能實現真正的封裝,是和他特有的函數作用域,函數支援內部函數,還有閉包分不開的。大家可以上網蒐集相關知識加深理解。
下面首先說的就是函數作用域,在javascript中如果在一個函數內部定義了一個變量,那麼函數外部是沒有辦法訪問的。其實在javascript中實作私有屬性或是方法就是利用了它這個特殊屬性。範例:
程式碼如下:
function foo() {
複製程式碼
程式碼如下:
var blat = foo(); // blat is another reference to bar.
blat(); // returns 20, because a new copy of a is being used.
這就是在前面提到的javascript函數支援內部函數。內部函數bar可以存取私有變數a,函數foo又把內部函數bar拋出給baz,baz就可以存取到內部變數a了,這就實現了閉包。大家一看也就明白了,這樣其實就實現了私有變數和方法。回到我們前面book的例子,實作如下:
複製程式碼
程式碼如下:
var Book = function(newIsbn, newTitle, newAuthor) {
// 實作 Publication
/ 私有屬性。
var isbn,標題,作者;
函數 checkIsbn(isbn) {
...
}
}
// 特權方法。
this.getIsbn = function() {
if(!checkbn(newIsbIs)) throw newIsbIsn 是Error('書:無效的ISBN。');
isbn = newIsbn;
this.getTitle = function() {
🎜title = newTitle || '未指定標題';
this.getAuthor = function() {
返回作者;
this.setAuthor = function(newAuthor) {
author = newAuthor || '未指定作者';
this.setIsbn(newIsbn);
this.setTitle(newTitle);
this.setAuthor(newAuthor);
};
// 公共的、非特權的方法。
Book.prototype = {
🎜display: function() {
🎜...
};
上述程式碼就實作了isbn , title,author和checkIsbn的樹化,外部是決定不能直接訪問到的。如需存取isbn,title,author只能透過物件級的方法getTitle ,setTitle...。例如要給isbn屬性,只能用theHobbit.setIsbn = '978-0261103283';,如果你還用theHobbit._isbn = '978-0261103283';,那麼要報錯了。
好了,今天的內容就講到這裡了,希望對大家有幫助。 下一作者:站永遠

JavaScript在現實世界中的應用包括前端和後端開發。 1)通過構建TODO列表應用展示前端應用,涉及DOM操作和事件處理。 2)通過Node.js和Express構建RESTfulAPI展示後端應用。

JavaScript在Web開發中的主要用途包括客戶端交互、表單驗證和異步通信。 1)通過DOM操作實現動態內容更新和用戶交互;2)在用戶提交數據前進行客戶端驗證,提高用戶體驗;3)通過AJAX技術實現與服務器的無刷新通信。

理解JavaScript引擎內部工作原理對開發者重要,因為它能幫助編寫更高效的代碼並理解性能瓶頸和優化策略。 1)引擎的工作流程包括解析、編譯和執行三個階段;2)執行過程中,引擎會進行動態優化,如內聯緩存和隱藏類;3)最佳實踐包括避免全局變量、優化循環、使用const和let,以及避免過度使用閉包。

Python更適合初學者,學習曲線平緩,語法簡潔;JavaScript適合前端開發,學習曲線較陡,語法靈活。 1.Python語法直觀,適用於數據科學和後端開發。 2.JavaScript靈活,廣泛用於前端和服務器端編程。

Python和JavaScript在社區、庫和資源方面的對比各有優劣。 1)Python社區友好,適合初學者,但前端開發資源不如JavaScript豐富。 2)Python在數據科學和機器學習庫方面強大,JavaScript則在前端開發庫和框架上更勝一籌。 3)兩者的學習資源都豐富,但Python適合從官方文檔開始,JavaScript則以MDNWebDocs為佳。選擇應基於項目需求和個人興趣。

從C/C 轉向JavaScript需要適應動態類型、垃圾回收和異步編程等特點。 1)C/C 是靜態類型語言,需手動管理內存,而JavaScript是動態類型,垃圾回收自動處理。 2)C/C 需編譯成機器碼,JavaScript則為解釋型語言。 3)JavaScript引入閉包、原型鍊和Promise等概念,增強了靈活性和異步編程能力。

不同JavaScript引擎在解析和執行JavaScript代碼時,效果會有所不同,因為每個引擎的實現原理和優化策略各有差異。 1.詞法分析:將源碼轉換為詞法單元。 2.語法分析:生成抽象語法樹。 3.優化和編譯:通過JIT編譯器生成機器碼。 4.執行:運行機器碼。 V8引擎通過即時編譯和隱藏類優化,SpiderMonkey使用類型推斷系統,導致在相同代碼上的性能表現不同。

JavaScript在現實世界中的應用包括服務器端編程、移動應用開發和物聯網控制:1.通過Node.js實現服務器端編程,適用於高並發請求處理。 2.通過ReactNative進行移動應用開發,支持跨平台部署。 3.通過Johnny-Five庫用於物聯網設備控制,適用於硬件交互。


熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

MinGW - Minimalist GNU for Windows
這個專案正在遷移到osdn.net/projects/mingw的過程中,你可以繼續在那裡關注我們。 MinGW:GNU編譯器集合(GCC)的本機Windows移植版本,可自由分發的導入函式庫和用於建置本機Windows應用程式的頭檔;包括對MSVC執行時間的擴展,以支援C99功能。 MinGW的所有軟體都可以在64位元Windows平台上運作。

SublimeText3漢化版
中文版,非常好用

EditPlus 中文破解版
體積小,語法高亮,不支援程式碼提示功能

Atom編輯器mac版下載
最受歡迎的的開源編輯器

禪工作室 13.0.1
強大的PHP整合開發環境