在 javascript 中有很多方式來創建對象,所以創建對象的方式使用起來非常靈活。那麼,到底哪一種方式是最恰當的物件創建方式呢?建構模式,原型模式還是物件原意模式(Object literal)呢?
但這些模式具體又是怎麼回事呢?
在開始講解之前,讓我們先清楚地介紹一下關於 javascript 基本知識。
有沒有可能在 javascript 中實現物件導向程式設計的方式呢?
答案是可能的,javascript 是可以創建物件的!這種物件可以包含資料及能夠操作資料的方法,甚至可以包含其他物件。它沒有類別但擁有建構函數;它沒有類別繼承機制,但是可以透過原型(prototype)實現繼承。
現在看起來,我們已經了解了在 javascript 中建立物件及實作基於物件程式設計時所必須的組成部分。
我們都知道 javascript 擁有私有變數。一個透過「var」關鍵字定義的變量,只能在函數體中被訪問,而不能在函數外被訪問。那麼,如果我們不透過使用「var」關鍵字來定義變數會怎麼樣呢?我們現在不對這個問題進行深入探討,可能是透過「this」進行訪問的,我會在另外的時間來詳細講述這個問題。
現在回到之前的問題。到底哪一種方式是最恰當的物件創建方式呢?
讓我們用已經知道的知識,透過創建Person的物件是來試驗一下。
var Person = { firstName : 'John' ,
lastName : 'Cody',
fullName : '',
message : '',
createFullName : function () {
fullName = this.firstName ' this. lastName;
},
changeMessage : function (msg) {
this.message = msg;
},
getMessage : function (>},
getMessage : function () {this
.createFullName();
return this.message ' ' fullName;
}
}
Person.firstName = 'Eli';
Person.lastName = 'Flowers' Person.changeMessage('welcome');
var message = Person.getMessage(); // welcome Eli Flowers
alert(message);
這是物件原意模式( literal pattern)。這非常接近我們經常創建物件的方式。如果你不需要關心私有/包裝的成員,並且你知道不將創建這個物件的實例。那麼,這種方式將會很適合你。公有的成員可以做所有私有成員的事情,不是嗎?但是,這不是一個類,而是一個物件而已,不能被建立實例並且不能被繼承。
讓我們嘗試下其他的方面: 代碼如下:
var Person = {
firstName : 'John',
lastName : 'Cody',
fullName : '',
message : '',
createFullName : function ) {
fullName = this.firstName ' ' this.lastName;
},
changeMessage : function (msg) {
this.message = msg; >
getMessage : function () {
this.createFullName();
return this.message ' ' fullName;
} }
Person.firstName = 'Eli>
Person.firstName = 'Eli ';
Person.lastName = 'Flowers'
Person.changeMessage('welcome');
var message = Person.getMessage(); // welcome Eli Flowers
alert(message);
這是一種建構模式的實例(Constructor Pattern)。那麼,這是類別還是物件呢?應該 兩種都算是吧。我們能夠在當請求時把它當作物件Person來使用。它畢竟也只是一個函數而已。然而,它可以透過使用“new”關鍵字來實現創建新的實例功能。
在使用這種方式時,我們需要時刻記住以下要點:
1. 無論什麼時候這個函數被調用時,它擁有一個特別的變量叫做“this”並且可以在全域範圍內使用。全域範圍依賴這個函數本身的作用範圍。
2. 無論何時透過「new」關鍵字建立這個函數的實例,「this」變數指向這個函數本身,而這個「new」操作將會影響到函數體內的程式碼被執行。這也正是建構模式。
3. 任何附加到「this」變數下的變數都會成為公有屬性並且任何透過「var」關鍵字定義的變數都將是屬於私有屬性。
4. 一個附加到「this」下的函數叫做特權函數,它可以存取所有的私有變數以及被附加到「this」下的函數及變數。
5. 私有函數可以存取到其他私有變數及私有函數。
6. 私有函數不能直接存取被附加到「this」變數和函數。我們可以透過創建一個私有變數「_that」並且將它賦值為「this」的方式來實現。
7. 任何私有變數及函數對於其他私有函數及其他被附加到「this」的函數是可用的。這完全是可能的再javascript的作用範圍下。
8. 一個變數:不是透過「var」關鍵字,也不是附加到「this」變數上以獲得全域作用範圍的。例如,對於一個自訂函數的作用範圍。需要再一次了解作用域及群聚的知識。
這已經實現了我們想要的大部分要求了,但是,有時「this」和「that」這兩個入口變數很容易造成給人帶來疑惑。尤其對於那些一直堅持要求純粹私有的人來說,更容易迷惑。
讓我們再稍微修改下試試看。
var Person = function () {
var Person = function () {
//private
var firstName = 'John';
var lastName = 'Cody';
var fullName = '';
var message = '';
var message = '';
var message = '';
var message = '';
var message = '';
var message = '';
var message = '';
var >var createFullName = function () {
fullName = firstName ' ' lastName;
}
//public setters
var setMessage = function (msg) {
message = msg;
}
var setFirstName = function (fName) {
firstName = fName;
}
var setLastName = function (lName) {
lastName = lName;
}
var getMessage = function () {
createFullName();
}
//functions expos >return {
setFirstName: setFirstName,
setLastName: setLastName,
setMessage: setMessage,
var Person = function () {
//private
varwelcomeMessage = '歡迎';
var fullName = '';
var 名字= '';
var fullName = '';
var 名字= '';
var 姓= "";
var createFullName = function () {
Person.prototype.setFirstName('asdsad');
全名= 名字' ' 姓氏;
};
//建構子
var Person = function () { }; // 每次都會建立
//public
Person.prototype = {
getFullName: function ( ) {
createFullName();
回傳welcomeMessage ' ' fullName;
},
setFirstName: function (fName) {
firstName = fName
},
},
lastName = lName;
},
ChangeMessage: function (mesg) {
welcomeMessage = mesg;
}
}
}
>回傳新的Person(); // 人; //新人();
};
var person1 = new Person();
person1.setFirstName('Eli' );
person1.setLastName('花');
person1.ChangeMesage('歡迎');
var message = person1.getFullName(); // 歡迎asdsad 花
原型模式存在的一個問題是它無法訪問血管電極及血管函數,正因為這個問題,我們才會介紹閉包以及組織始終好類中存在的代碼以使得創建它在全域範圍內不會變得很混亂。所有都是屬於 Person 類別的作用範圍內。
另外一個問題是每次實例建立時,所有的程式碼都會重複執行,包括繼承的綁定。對我們中的一部分人來說,這只是一個效率問題。處理好這個問題的一種方式只是在需要的共有函數不可用的情況下綁定這個原型。
這樣將會啟用綁定原型操作只是在第一個實例被建立時執行,並且之後所有其他實例都將僅進行檢查操作。不幸的是,這仍然無法解決我們上面提到的範例中的問題問題,因為我們只有再來一次建立用於產生一個閉包的函數才能達到這樣的效果。這樣的話,至少我們減少了一部分記憶體的使用。
等等,還有另一個問題是外部函數不能直接存取原型函數。
為什麼你們一定需要外部函數和外部變數?我知道你一定是想實現類別的封裝性,想確保類別中的屬性或內部的資料不會被突然修改了或被內部的其他程式所修改,或是任何其他的操作…
你應該記住你是不能將javascript 程式碼編譯成二進位的,對於這種情況,你在主機板很煩惱火吧,這樣程式碼總是可用的。所以,如果有人想搞亂程式碼的話,不管你真正沒有實物或沒有實物,不管你將程式碼給團隊中一定的其他成員或賣掉去,他們都可以攪亂程式碼。實現樹化可能有那麼一點點幫助吧。
(function () {
var Person = function () {
this._fullName = ''
; this.firstName = ''; "";
_that = this;
this._createFullName = function () {
this.ChangeMessage('Namaste');
this.ChangeMessage('Namaste');
this ._fullName = this.firstName ' ' this.姓;
};
}
//用於程式碼最佳化的共用函數
Person.prototype = {
constructor: Person ,
getFullName: function () {
this._createFullName();
回傳this.welcomeMessage ' ' this._fullName;
},
ChangeMesmessage: functionmessage: function (mesgage) {
this.welcomeMessage = mesg;
}
}
this.Person = Person;
})();
var person1 = new Person() ;
person1.firstName = 'Eli';
person1.lastName = '花';
person1.ChangeMesage('歡迎');
var message = person1.getFullName(); // Namaste Eli Flowers
alert(message);
我不是說你不應該考慮 “private” 或類似的知識。你是程式碼的設計者,所以你將知道怎麼來管理並且知道怎麼做才是最好的。根據你的需求,你可以使用任何一種設計模式或多個設計模式組合一起使用。
無論你決定採用哪種設計模式,始終記住做盡量少的事情,不要在全局作用範圍內實現閉包,盡量減少內存洩露,以及優化代碼,並且組織好代碼。所以,盡量多了解些作用域,閉包以及 “this” 的表現行為。
最後,祝程式愉快!
譯後感
經常使用 javascript,對於它的印像一直都是直接拷貝過來就可以用的。最近使用 extjs,它的類別框架非常好用。從這樣文章也明白在 javascript 中實作類別的各種方式,以及在文章最後討論了類別中私有成員的實作情況。

理解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庫用於物聯網設備控制,適用於硬件交互。

我使用您的日常技術工具構建了功能性的多租戶SaaS應用程序(一個Edtech應用程序),您可以做同樣的事情。 首先,什麼是多租戶SaaS應用程序? 多租戶SaaS應用程序可讓您從唱歌中為多個客戶提供服務

本文展示了與許可證確保的後端的前端集成,並使用Next.js構建功能性Edtech SaaS應用程序。 前端獲取用戶權限以控制UI的可見性並確保API要求遵守角色庫


熱AI工具

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

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

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

WebStorm Mac版
好用的JavaScript開發工具

記事本++7.3.1
好用且免費的程式碼編輯器

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

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

VSCode Windows 64位元 下載
微軟推出的免費、功能強大的一款IDE編輯器