JS中的phototype詳解

来源:http://www.cnblogs.com/niuboren/archive/2017/02/04/6363956.html
-Advertisement-
Play Games

作者:軒脈刃 1 原型法設計模式 在.Net中可以使用clone()來實現原型法 原型法的主要思想是,現在有1個類A,我想要創建一個類B,這個類是以A為原型的,並且能進行擴展。我們稱B的原型為A。 2 javascript的方法可以分為三類: a 類方法 b 對象方法 c 原型方法 例子: func ...


作者:軒脈刃

1 原型法設計模式

在.Net中可以使用clone()來實現原型法

原型法的主要思想是,現在有1個類A,我想要創建一個類B,這個類是以A為原型的,並且能進行擴展。我們稱B的原型為A。

2 javascript的方法可以分為三類:

a 類方法

b 對象方法

c 原型方法

例子:

  1. functionPeople(name)
  2. {
  3. this.name=name;
  4. //對象方法
  5. this.Introduce=function(){
  6. alert("My name is "+this.name);
  7. }
  8. }
  9. //類方法
  10. People.Run=function(){
  11. alert("I can run");
  12. }
  13. //原型方法
  14. People.prototype.IntroduceChinese=function(){
  15. alert("我的名字是"+this.name);
  16. }
  17.  
  18. //測試
  19.  
  20. var p1=newPeople("Windking");
  21.  
  22. p1.Introduce();
  23.  
  24. People.Run();
  25.  
  26. p1.IntroduceChinese();

運行一下 »

3 obj1.func.call(obj)方法

意思是將obj看成obj1,調用func方法

好了,下麵一個一個問題解決:

prototype是什麼含義?

javascript中的每個對象都有prototype屬性,Javascript中對象的prototype屬性的解釋是:返回對象類型原型的引用。

A.prototype = new B();

理解prototype不應把它和繼承混淆。A的prototype為B的一個實例,可以理解A將B中的方法和屬性全部克隆了一遍。A能使用B的方法和屬性。這裡強調的是克隆而不是繼承。可以出現這種情況:A的prototype是B的實例,同時B的prototype也是A的實例。

先看一個實驗的例子:

  1. function baseClass()
  2. {
  3. this.showMsg =function()
  4. {
  5. alert("baseClass::showMsg");
  6. }
  7. }
  8.  
  9. function extendClass()
  10. {
  11. } extendClass.prototype =new baseClass();
  12. var instance =new extendClass();
  13. instance.showMsg();// 顯示baseClass::showMsg

 

運行一下 »

我們首先定義了baseClass類,然後我們要定義extentClass,但是我們打算以baseClass的一個實例為原型,來克隆的extendClass也同時包含showMsg這個對象方法。

extendClass.prototype = new baseClass()就可以閱讀為:extendClass是以baseClass的一個實例為原型克隆創建的。

那麼就會有一個問題,如果extendClass中本身包含有一個與baseClass的方法同名的方法會怎麼樣?

下麵是擴展實驗2:

  1. function baseClass()
  2. {
  3. this.showMsg =function()
  4. {
  5. alert("baseClass::showMsg");
  6. }
  7. }
  8.  
  9. function extendClass()
  10. {
  11. this.showMsg =function()
  12. {
  13. alert("extendClass::showMsg");
  14. }
  15. }
  16.  
  17. extendClass.prototype =new baseClass();
  18. var instance =new extendClass();
  19.  
  20. instance.showMsg();//顯示extendClass::showMsg

運行一下 »

實驗證明:函數運行時會先去本體的函數中去找,如果找到則運行,找不到則去prototype中尋找函數。或者可以理解為prototype不會克隆同名函數。

 

 

那麼又會有一個新的問題:

如果我想使用extendClass的一個實例instance調用baseClass的對象方法showMsg怎麼辦?

 

答案是可以使用call:

  1. extendClass.prototype =new baseClass();
  2. var instance =new extendClass();
  3.  
  4.  
  5. var baseinstance =new baseClass();
  6. baseinstance.showMsg.call(instance);//顯示baseClass::showMsg

運行一下 »

這裡的baseinstance.showMsg.call(instance);閱讀為“將instance當做baseinstance來調用,調用它的對象方法showMsg”

 

好了,這裡可能有人會問,為什麼不用baseClass.showMsg.call(instance);

這就是對象方法和類方法的區別,我們想調用的是baseClass的對象方法

 

最後,下麵這個代碼如果理解清晰,那麼這篇文章說的就已經理解了:

  1. <script type="text/javascript">
  2.  
  3. function baseClass()
  4. {
  5. this.showMsg =function()
  6. {
  7. alert("baseClass::showMsg");
  8. }
  9. this.baseShowMsg =function()
  10. {
  11. alert("baseClass::baseShowMsg");
  12. }
  13. }
  14. baseClass.showMsg =function()
  15. {
  16. alert("baseClass::showMsg static");
  17. }
  18.  
  19. function extendClass()
  20. {
  21. this.showMsg =function()
  22. {
  23. alert("extendClass::showMsg");
  24. }
  25. }
  26. extendClass.showMsg =function()
  27. {
  28. alert("extendClass::showMsg static")
  29. }
  30.  
  31. extendClass.prototype =new baseClass();
  32. var instance =new extendClass();
  33.  
  34. instance.showMsg();//顯示extendClass::showMsg
  35. instance.baseShowMsg();//顯示baseClass::baseShowMsg
  36. instance.showMsg();//顯示extendClass::showMsg
  37.  
  38. baseClass.showMsg.call(instance);//顯示baseClass::showMsg static
  39.  
  40. var baseinstance =new baseClass();
  41. baseinstance.showMsg.call(instance);//顯示baseClass::showMsg
  42.  
  43. </script>

 

 

 

運行一下 »

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 1、簡單工廠模式UML UML如下: 圖1. 簡單工廠模式UML 2、C++實現 類視圖如下: 圖2. C++實現簡單工廠模式類視圖 其中,SimpleFactory實現為: 3、Java實現 類視圖為: 圖3. Java實現簡單工廠模式類視圖 其中,SimpleFactory實現為: ...
  • (0)寫在前面 編程和現實世界是息息相關的,你是如何理解現實世界中的繼承呢? 繼承在編程中應理解為:對父類資源(本文只討論方法)的使用,父類方法只提供類基本的功能,父類方法之間不存在調用關係。 (1)案例介紹 我們有這樣一個任務,控制一個人上下左右移動,我們開始構建類。 等等,上面的類違反了高內聚低 ...
  • CSS 偽類 (Pseudo-classes) 錨偽類:在支持 CSS 的瀏覽器中,鏈接的不同狀態都可以不同的方式顯示,這些狀態包括:活動狀態,已被訪問狀態,未被訪問狀態,和滑鼠懸停狀態。 a:link {color: #FF0000} /* 未訪問的鏈接 */ a:visited {color: ...
  • 一、關於漸變 漸變是一種應用於平面的視覺效果,可以從一種顏色逐漸地轉變成另外一種顏色,故可以創建類似於彩虹的效果漸變可以應用在任何可以使用圖片的地方。例如,您可以指定一個這麼一個漸變:頂部的顏色是紅色,中間的是藍色,底部為黃色來作為div的背景色。漸變通過-webkit-gradient方法實現,可 ...
  • 可以實現手勢操作:拖動、縮放、旋轉。封裝好的腳本方法是這樣的: html代碼: js調用: 轉載地址:http://blog.csdn.net/somethin...touch官網地址:https://www.awesomes.cn/repo/... ...
  • 最近剛閱讀完《高性能javascript》,想談談對js性能優化的看法。理解有些不同,可能還需要各位多多提醒。 話不多說,提到javascript難免會聯想到文檔對象模型(DOM),它作用於XML和HTML文檔的程式介面(API),位於瀏覽器中,主要用來與HTML文檔打交道。同樣也用於Web程式中獲 ...
  • 首先請看網友通過setTimeout實現的: 分析: 用setTimeout模擬線程,有一個事件處理隊列(this.tasks),然後每一個事件內部會調用事件調度函數(next),每一次的業務邏輯是通過定義的閉包函數fn,fn內部在處理完自身業務會執行next函數。 於是就想起處理這種含有非同步並且有 ...
  • 本文實現自定路由,主要是事件hashchange的使用,然後根據我們的業務需求封裝。 首先實現一個router的類,並實例化。 上邊唯一需要註意的是,在使用addEventListener的時候,需要註意bind函數的使用,因為我是踩了坑,這才體會到$.proxy()。 上邊使用的時候可以使用兩種方 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...