簡單分析JavaScript中的面向對象

来源:http://www.cnblogs.com/lingxin/archive/2016/11/18/6077077.html
-Advertisement-
Play Games

初學JavaScript的時候有人會認為JavaScript不是一門面向對象的語言,因為JS是沒有類的概念的,但是這並不代表JavaScript沒有對象的存在,而且JavaScript也提供了其它的方式來解決面向對象的問題。所以JavaScript也是一門面向對象的語言。 面向對象僅僅是一個概念或者 ...


初學JavaScript的時候有人會認為JavaScript不是一門面向對象的語言,因為JS是沒有類的概念的,但是這並不代表JavaScript沒有對象的存在,而且JavaScript也提供了其它的方式來解決面向對象的問題。所以JavaScript也是一門面向對象的語言。

面向對象僅僅是一個概念或者編程思想而已,它不應該依賴於某個語言存在。比如 PHP採用面向對象思想構造其語言,它實現了類、繼承、派生、多態、介面等機制。但是這些機制,只是實現面向對象編程的一種手段,而非必須。換言之,一門語言可以根據其自身特性選擇合適的方式來實現面向對象。因而先入為主地接受了"類"這個面向對象實現方式。

JavaScript不同於其它語言,它是通過原型(prototype)的方式來實現面向對象編程的,也就是說對象(object)是依靠構造器(constructor)利用原型(prototype)構造出來的,而有時也稱它為偽類。

下麵說一下麵向對象的實現方式,為了好理解,我們借鑒其它語言中類和對象的思想來簡單分析一下:

一:最簡單的面向對象(即使用JSON方式來聲明)

定義一個偽類:

var Ren = {
     name:"張三",   //相當於成員變數
     sex:"男",     //相當於成員變數
     age:18,       //相當於成員變數
     say:function(){ //相當於成員方法
             alert("講話");
         }
     };

調用類裡面的成員:

Ren.say();

通過上面的例子可以看出來,該類裡面的成員相當於其它語言裡面的靜態成員,通過類名調用。
這種方式基本可以滿足開發的需求,但是相對於其它語言來說沒有實現封裝、繼承和多態,所以代碼的重用性比較差。

二:使用原型的方式(函數構造器)

定義一個類:

function Ren(){  
    var name="張三";  //私有的成員變數
    var sex ="男";    //私有的成員變數
    this.PublicName="zhangsan", //公有的成員變數
    this.setName = function(_name){ //成員方法
            name=_name;
        }  
    this.getName = function(){ //成員方法
            return name;
        }  
} 

造對象並且調用對象的成員:

var r = new Ren();
r.getName();

在創建對象的時候,會運行類似於這樣的代碼,使用構造器來創建對象:

this.prototype = {constructor: this}

函數的prototype的屬性的值被作為原型對象來克隆出新對象。

雖然使用new運算符調用函數看起來像是使用模板實例化的方式來創建對象,但本質還是以原型對象來克隆出新對象,目前我們看它像是一個類,但還有一點就是每new Ren(),不但屬性產生副本,方法也會產生副本。

如果不想讓方法產生複本,它提供了prototype這個屬性,即原型。所有實例都會共用它裡面的屬性和方法。

可以在定義對象的時候:把屬性放到定義里,而把對象的方法放到原型里!

如下:

function Ren(name, age) {
    this.name = "張三";
    this.age = 18;
};

Ren.prototype.say = function(){ //方法放在原型裡面
    alert("hello");
};

調用該成員方法:

var r = new Ren();
r.say();

以上兩種方式都可以實現JavaScript中的面向對象,實際上每種語言的面向對象思想都是一致的,只是方法有所不同而已,在JavaScript這門強大的語言裡面依然是有面向對象存在的只是我們學習了其它語言的面向對象之後,有種先入為主的感覺,對JavaScript的面向對象產生疑惑,所以一定謹記面向對象是一種思想,不是一種方法。

 


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

-Advertisement-
Play Games
更多相關文章
  • 轉自:https://www.douban.com/note/145065606/ 《省得每次都得去翻麻煩》 過濾器,變數的顯示形式的改變一、形式:小寫{{ name | lower }} 二、串聯:先轉義文本到HTML,再轉換每行到 <p> 標簽{{ my_text|escape|linebrea ...
  • 有三種方法可以使一個Action處理多個請求 這裡就說一下Dynamic Method nvocation ,動態方法調用,什麼是動態方法調用呢,就是一個Action裡面包含多個方法調用 一般情況下,我們只需要在Action中寫一個execute的方法,並返回String 就可以了,或者繼承Acti ...
  • 服務端 rest api ...
  • 我們做網站的時候經常要用到excel導入和導出的功能,我們通常的做法是用phpexcel工具包來完成,具體方法如下: html代碼: 寫ExcelController工具類:此類用來被實例化 下麵書寫控制器來上傳excel表格:此類方法不用把excel表格傳遞到伺服器,直接寫入數據: ...
  • 下載python: 從從https://www.python.org/downloads/下載python,根據操作系統的不同,選擇不同的版本下載。註意:linux系統大多預裝了python,可以直接使用。 ubuntu16.04中已安裝python2.7和python3.x版本,輸入python和 ...
  • socket通信的原理在這裡就不說了,它的用途還是比較廣泛的,我們可以使用socket來做一個API介面出來,也可以使用socket來實現兩個程式之間的通信,我們來研究一下在php裡面如何實現socket通信。 由於socket服務端的代碼要監聽埠,等待接收請求,所以php在做socket服務的時 ...
  • B1024/A1073/A1001/A1005/A1035/A1077/A1082 ...
  • ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...