js中的面向對象

来源:http://www.cnblogs.com/-yhq/archive/2015/12/31/5091107.html
-Advertisement-
Play Games

一、 生成對象的原始模式假定我們把Bob看成一個對象,它有"name"和"age"兩個屬性。 var person = { name : '', age : }現在,我們需要根據這個原型對象的規格(schema),生成兩個實例對象。 var person1 = {}; // 創建...


一、 生成對象的原始模式

假定我們把Bob看成一個對象,它有"name"和"age"兩個屬性。

  var  person = {

    name : '',

      age :

      }

現在,我們需要根據這個原型對象的規格(schema),生成兩個實例對象。

  var person1 = {}; // 創建一個空對象

    person1.name = "Bob"; // 按照原型對象的屬性賦值

    person1.age= 18;

  var person2 = {};

    person2.name = "jim";

           person2.age = 20;

好了,這就是最簡單的封裝了,把兩個屬性封裝在一個對象裡面。但是,這樣的寫法有兩個缺點,一是如果多生成幾個實例,寫起來就非常麻煩;二是實例與原型之間,沒有任何辦法,可以看出有什麼聯繫。

二、 原始模式的改進

我們可以寫一個函數,解決代碼重覆的問題。

  function person(name,age){

    return {

      name:name,

      age:age

    }

然後生成實例對象,就等於是在調用函數:

  var person1 = person("Bob",18);

      var person2 = person("jim",20);

這種方法的問題依然是,person1和person2之間沒有內在的聯繫,不能反映出它們是同一個原型對象的實例。

三、 構造函數模式

為瞭解決從原型對象生成實例的問題,Javascript提供了一個構造函數(Constructor)模式。

所謂"構造函數",其實就是一個普通函數,但是內部使用了this變數。對構造函數使用new運算符,就能生成實例,並且this變數會綁定在實例對象上。

比如,person的原型對象現在可以這樣寫,

  function person(name,age){

    this.name=name;

    this.age=age;

}

我們現在就可以生成實例對象了。

  var person1 = new person("Bob",18);

  var person2 = new person("jim",20);

  alert(person1.name); // Bob

      alert(person1.age); // 18

這時person1和person2會自動含有一個constructor屬性,指向它們的構造函數 

  alert(person1.constructor == person); //true

  alert(person2.constructor == person); //true

Javascript還提供了一個instanceof運算符,驗證原型對象與實例對象之間的關係。

  alert(person1 instanceof person); //true

  alert(person2 instanceof person); //true

四、構造函數模式的問題

構造函數方法很好用,但是存在一個浪費記憶體的問題。

請看,我們現在為Cat對象添加一個不變的屬性"type"(種類),再添加一個方法lesson(課程)。那麼,原型對象person就變成了下麵這樣:

  function person(name,age){

    this.name = name;

    this.age= age;

    this.type = "理科";

    this.lesson = function(){alert("課程");};

  }

還是採用同樣的方法,生成實例:

  var person1 = new person("Bob",18);

  var person2 = new person ("jim",20);

  alert(person1.type); // 理科

  person1.lesson(); // 課程

能不能讓type屬性和lesson()方法在記憶體中只生成一次,然後所有實例都指向那個記憶體地址呢?回答是可以的。

五、 Prototype模式

Javascript規定,每一個構造函數都有一個prototype屬性,指向另一個對象。這個對象的所有屬性和方法,都會被構造函數的實例繼承。

這意味著,我們可以把那些不變的屬性和方法,直接定義在prototype對象上。

  function person(name,age){

    this.name = name;

    this.age= age;

  }

  person.prototype.type = "理科";

  person.prototype.lesson = function(){alert("課程")};

然後,生成實例。

  var person1 = new person("Bob",18);

  var person2 = new person("jim",20);

  alert(person1.type); // 理科

  person1.lesson(); // 課程

這時所有實例的type屬性和lesson()方法,其實都是同一個記憶體地址,指向prototype對象,因此就提高了運行效率。  

alert(person1.lesson== person2.lesson); //true

六、 Prototype模式的驗證方法

為了配合prototype屬性,Javascript定義了一些輔助方法,幫助我們使用它。,

6.1 isPrototypeOf()

這個方法用來判斷,某個proptotype對象和某個實例之間的關係。

  alert(person.prototype.isPrototypeOf(person1)); //true

  alert(person.prototype.isPrototypeOf(person2)); //true

6.2 hasOwnProperty()

每個實例對象都有一個hasOwnProperty()方法,用來判斷某一個屬性到底是本地屬性,還是繼承自prototype對象的屬性。

  alert(person1.hasOwnProperty("name")); // true

  alert(person1.hasOwnProperty("type")); // false

6.3 in運算符

in運算符可以用來判斷,某個實例是否含有某個屬性,不管是不是本地屬性。

  alert("name" in person1); // true

  alert("type" in person1); // true

in運算符還可以用來遍歷某個對象的所有屬性。

for(var prop in cat1) { alert("cat1["+prop+"]="+cat1[prop]); }  

 


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

-Advertisement-
Play Games
更多相關文章
  • jQuery添加和刪除元素class屬性實例代碼:元素的的class屬性一般是用來設置樣式之用,所以添加或者刪除都意味著改變元素的樣式,下麵就介紹一下如何使用jQuery來刪除和添加元素的class屬性值,希望能夠給大家帶來一定的幫助。代碼實例如下:function switchTeachContr...
  • javascript實現的視窗抖動代碼實例:視窗抖動效果在很多地方都有應用,例如網易的登陸視窗就有這樣的效果,當登陸失敗的時候就會出現抖動效果,這不但有動感,而且讓人感覺新穎,下麵是一段這樣的代碼實例,和大家分享一下。代碼如下:視窗登陸效果-螞蟻部落 點擊振動 以上代碼中,當點擊按鈕的時候,...
  • CSS如何設置連接的樣式:網站中,可能需要將鏈接的樣式設置的更為美觀一些,在預設情況下,鏈接在沒有點擊和點擊後的樣式是有所差別的,這就是一個人性化的效果,可以有效的區分鏈接是否已經被點擊過,下麵就介紹一下如何設置連接的樣式。一.樣式屬性:1.a:link:定義鏈接點擊前的樣式。2.a:visited...
  • 如何將checkbox覆選框設置為只讀:覆選框checkbox並沒有readOnly屬性,但是如果將其設置為不可用也就是將它的disabled="disabled",checkbox值不會被髮送,並且外觀呈現灰色,下麵就介紹一下如何模擬實現覆選框的只讀狀態。一.原生javascript代碼:ckOb...
  • 判斷覆選框中是否有被選中的代碼實例:覆選框中一般多項,有時候我們需要判斷這些付選中是否有被選中的項,下麵就通過一個實例簡單介紹一下如何實現此效果。代碼如下:限定覆選框的可選個數-螞蟻部落 螞蟻部落一 螞蟻部落二螞蟻部落三 螞蟻部落四螞蟻部落五 螞蟻部落六螞蟻部落七 螞蟻部落八螞蟻部落九 螞蟻部...
  • CSS實現的相容所有瀏覽器的div懸浮在網頁一側的代碼:固定懸浮在網頁一側的效果應用非常的頻繁,尤其是客服系統或者公告系統,CSS提供了position:fixed屬性即可實現此功能,但是IE6瀏覽器並不支持,雖然IE6的用戶越來越少,但是畢竟還是有用戶在使用,所以最好還是要實現相容效果,下麵就是一...
  • 回到目錄大家好,今天有時間來介紹一下Lind.DDD框架里的消息機制,消息發送這塊一般的實現方法是將Email,SMS等集成到一個公用類庫里,而本身Email和SMS沒什麼關係,它們也不會有什麼介面約定,即你想實現某種消息的多態發送,不需要程式代碼,基本不可能實現,而在Lind.DDD裡面,大叔將它...
  • 你可以從你們現在項目裡面隨便找幾處註釋,看看寫註釋的代碼是不是存在如下兩種毛病之一:1. 命名不准確;2. 方法太長(超過50行)。如果你找到的代碼沒有出現上面兩種毛病而註釋依然存在,那你再看看這個註釋是否有實際意義,是不是這個註釋不要也無所謂呢。註釋是惡魔這個觀點可能你第一次看到,你可能很難接受,...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...