Javascript也是物件導向的語言,但它是一種基於原型Prototype的語言,而不是基於類別的語言。在Javascript中,類別和物件看起來沒有太多的區別。
什麼是prototype:
function定義的物件有一個prototype屬性,prototype屬性又指向了一個prototype對象,注意prototype屬性與prototype對像是兩個不同的東西,要注意區別。在prototype物件中又有一個constructor屬性,這個constructor屬性同樣指向一個constructor對象,而這個constructor物件恰恰就是這個function函數本身。 是不是很繞?用偽代碼表示如下:
var function{ prototype:prototype{ constructor:constructor == function } }
還不明白?看圖吧:
prototype的作用:
這個prototype到底有什麼作用呢?看下面的範例:
function jb51(){ } jb51.prototype.name = "a"; var test = new jb51(); alert(test.name)//"a";
奇怪吧,明明沒有為test設定name屬性,可是為什麼會有值?
這就是prototype的功勞了,uw3c中prototype屬性中的name對象,在uw3c被new建構子之後,被繼承到了對象test的屬性中。接著看:
var name = "js"; function jb51(name){ alert(this.name);//"css" } jb51.prototype.name = "css"; var test = new jb51(); test()
為什麼alert的值不是「js」?這個過程大致如下:
var test={}; uw3c.call(test);
第一步是建立一個新物件(test)。
第二步驟將該物件(test)內建的原型物件設定為建構子(就是uw3c)prototype 屬性所引用的那個原型物件。
第三步是將該物件(test)當作this 參數呼叫建構函式(就是uw3c),完成成員設定等初始化工作。
其中第二步驟出現了一個新名詞就是內建的原型對象,注意這個新名詞跟prototype對像不是一回事, 為了區別我叫它inobj,inobj就指向了函數uw3c的prototype對象。在uw3c的prototype物件中出現的任何屬性或函數都可以在test物件中直接使用,這個就是JS中的原型繼承了。
通常,這樣建立一個物件:
function person(name){ this.sayHi = function(){ alert('hi ' + this.name); } this.name = name; } var p = new person("dan"); p.sayHi();
以上,使用new關鍵字,透過物件(函數也是特殊物件)建立一個物件實例。
在基於類別的語言中,屬性或欄位通常都是在類別中事先定義好了,但在Javascript中,在建立物件之後還可以為類別新增欄位。
function animal(){} var cat = new animal(); cat.color = "green";
以上,color這個欄位只屬於目前的cat實例。
對於後加的字段,如果想讓animal的所有實例都擁有呢?
--使用Prototype function animal(){} animal.prototype.color= "green"; var cat = new animal(); var dog = new animal(); console.log(cat.color);//green console.log(dog.color);//green
透過Prototype不僅可以新增字段,還可以新增方法。
function animal(){} animal.prototype.color= "green"; var cat = new animal(); var dog = new animal(); console.log(cat.color);//green console.log(dog.color);//green animal.prototype.run = funciton(){ console.log("run"); } dog.run();
原來透過prototype屬性,在創建物件之後還可以改變物件的行為。
例如,可以為數組這個特殊物件添加一個方法。
Array.prototype.remove = function(elem){ var index = this.indexof(elem); if(index >= 0){ this.splice(index, 1); } } var arr = [1, 2, 3] ; arr.remove(2);
除了透過prototype為物件定義屬性或方法,還可以透過物件的建構子來定義類別的屬性或方法。
function animal(){ this.color = "green"; this.run = function(){ console.log("run"); } } var mouse = new animal(); mouse.run();
以上做法的也可以讓所有的animal實例共用所有的欄位和方法。並且還有一個好處是可以在建構函式中使用類別的局部變數。
function animal(){ var runAlready = false; this.color = "green"; this.run = funciton(){ if(!runAlreadh){ console.log("start running"); } else { console.log("already running") } } }
其實,一個更實際的做法是把透過建構函式結合透過prototype定義一個類別的欄位和行為。
function animal(){ var runAlready = false; this.run = function(){ if(!runAlready){ console.log('i am running'); } else { console.log("i am already running"); } } } animal.prototype.color = ''; animal.prototype.hide = funciton(){ console.log(""); } var horse = new animal(); horse.run(); horse.hide();
Prototype允許我們在創建物件之後來改變物件或類別的行為,並且這些透過prototype屬性添加的欄位或方法所有物件實例是共享的。

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 無盡。

熱門文章

熱工具

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

SecLists
SecLists是最終安全測試人員的伙伴。它是一個包含各種類型清單的集合,這些清單在安全評估過程中經常使用,而且都在一個地方。 SecLists透過方便地提供安全測試人員可能需要的所有列表,幫助提高安全測試的效率和生產力。清單類型包括使用者名稱、密碼、URL、模糊測試有效載荷、敏感資料模式、Web shell等等。測試人員只需將此儲存庫拉到新的測試機上,他就可以存取所需的每種類型的清單。

PhpStorm Mac 版本
最新(2018.2.1 )專業的PHP整合開發工具

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

ZendStudio 13.5.1 Mac
強大的PHP整合開發環境