JavaScript 面向對象

来源:https://www.cnblogs.com/qirui-/archive/2019/08/15/11360278.html
-Advertisement-
Play Games

1. 什麼是對象? 對象object 是一些相關的變數和方法的軟體集。 特性: 屬性和方法 JavaScript中的所有事物都是對象。 創建對象的方法: 建立一個工廠函數 2.什麼是面向對象? 面向對象是一個思想,就是把解決問題的註意力集中到對象上。 面向對象的三大特點:封裝 繼承 多態。 封裝:把 ...


1. 什麼是對象?

       對象object 是一些相關的變數和方法的軟體集。

       特性: 屬性和方法

       JavaScript中的所有事物都是對象。

       創建對象的方法:

  1. 字面量
  2. new Object()  創建
  3. 自定義構造函數
  4. Object.create() 創建
  5. 工廠函數
var obj = new Object();
// obj是對象,Object是類
// 對象是類的實例和具體,類是對象的集合

         建立一個工廠函數

function createStudent(name,age,ClassName){
            var obj = new Object();
            obj.name = name;
            obj.age = age;
            obj.ClassName = ClassName;
            obj.study = function(){
                console.log("學習Css");
            }
            return obj;
        }
        var ming=  createStudent("明",20,"1811");
        var hong=  createStudent("紅",21,"1811");
// 可以很好減少代碼量

 

2.什麼是面向對象?

        面向對象是一個思想,就是把解決問題的註意力集中到對象上。

        面向對象的三大特點:封裝 繼承 多態。    

        封裝:把所有相關的屬性和方法封裝在一個對象里。
        繼承:自己沒有的屬性或者方法,可以把別的拿過來用
        多態:不同的對象根據事件情況,執行代碼不同。js可以模擬實現。

3.常用的內置對象(構造函數)

Number String Boolean
Array Date Math RegExp
Function Object
Global Error

        構造函數: new  後面就是構造函數,構造函數中的this就是指向當前對象。

var arr = new Array();
// arr 是對象,Array 是類。 對象是由類所構造的。
// Array() 是構造函數

       把工廠函數變換成構造函數

function createStudent(name,age,ClassName){
            this.name = name;
            this.age = age;
            this.ClassName = ClassName;
            this.study = function(){
                console.log("學習Css");
            }
            return obj;
        }

        var ming= new createStudent("明",20,"1811");
        var hong= new createStudent("紅",21,"1811");

         ming.study();
         hong.study();

         // ming 是對象  createStudent是類  createStudent是構造函數
         // 類的本質還是函數
        

 

4.原型對象

         js就是基於原型的對象。

function Person(){

}
var xiaoming = new Person();
//1. 每個類(函數) 天生有一個prototype 的屬性,創建了一個對象,而這個對象的就是這個函數的原型,這個對象里有個constructor(構造函數) 的屬性,屬性值是類本身。
//2. 我們所有new 一個類的時候,其實是調用它的構造函數。構造函數里的屬性都是私有的,構造函數里的this都是實例對象。
//3. 每個對象上天生有一個__proto__ ,指向類的原型。

 

5.原型鏈

          原型鏈: 由各級對象的__proto__逐級繼承形成的關係。

          原型鏈的作用也是節省空間。

          __proto__和prototype:

                 1.  prototype 是類的或者函數的, __proto__ 是對象的。
                 2.  __proto__是查找機制 ,prototype是存儲機制。

function Person(name,age){  
        this.name= name;
}

 var zhang = new Person("zhang");
 console.log(zhang.name);  //zhang
 console.log(zhang.age);  //undefined

//當zhang 查找某個屬性時(比如:name):
//zhang 這個對象首先看name 是私有的,是就直接使用,不是的就通過 __proto__ 往它的 //類的prototype 上查找,有就直接使用,沒有就繼續向上查找,直到查找到基類object ,沒有 //就是undefined  ,有就直接使用。這種查找機制 叫原型鏈。

// 所以zhang.name 返回的是zhang,而zhang.age 返回undefined

 

6.繼承

         

// 父類
function Person(name){
     this.name = name;
     this.eat= function(){
      console.log("chi");
}
}
Person.prototype.age = 10; // 添加原型屬性

         1. 原型繼承

function Son(){
      this.age = 23;
}
var p1 = new Person("zhang");
Son.prototype = p1;
var s1 = new Son;
console.dir(s1.name); // zhang

// 將父類的實例賦值給子類的原型:私有的公有的都繼承為共有的。

 

       2. call繼承 (call方法是函數/類天生自帶的一個方法。);

       

function Son(){
      this.age = 23;
      Person.call(this,"123"8);
}
var p1 = new Person("zhang");
var s1 = new Son;
console.log(s1.age); // 23
console.log(s1.name); // 123

//只繼承了父類構造函數的屬性,沒有繼承父類原型的屬性。

        3. 冒充對象繼承

var p1 = new Person("zhang");

for(var key in p1){
        console.log(key); //name in 
}

// 將父類私有的和公有的都繼承為子類私有的 使用for in
// for in 可以遍歷對象的共有屬性fn就是公有的

 

        4. 混合繼承  (call 繼承和原型繼承的結合)

// 父類
function Person(name){
     this.name = name;
}
Person.prototype.age = 10; // 添加原型屬性

var p1 = new Person;
function Son() {
   Person.call(this); // 私有的繼承為私有的了
}
Son.prototype=p1;
var s1 = new Son;
console.log(s1); // zhang

// 私有的繼承為私有的 私有的和公有的再次繼承為公有的。

 

         5. 組合繼承

         

         // 父類
        function Person(){   
            this.name ="zhang";
        }
        Person.prototype.fn=function(){
            console.log(111);
        }
        var p = new Person;

         // 子類
        function Son(){
            Person.call(this);
        }
        Son.prototype=Object.create(Person.prototype);
        var s = new Son;
        s.__proto__.fn=function(){
            console.log(222);
        }
        s.fn(); //222
        p.fn(); //111

          6.  中間類繼承

           

function fn(a,b,c){
            arguments.__proto__ = Array.prototype;
            arguments.push(89);
            console.log(arguments);
}
fn(45,56,23); //45,56,23,89

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

-Advertisement-
Play Games
更多相關文章
  • DOM:文檔對象模型,定義訪問和處理html文檔的標準方法。 DOM節點有: 元素節點:<html> <body>之類的都是 文本節點:向用戶展示內容,如<li>…</li>中的JavaScript、DOM、CSS等 屬性節點:元素屬性,如<a>標簽內的鏈接屬性href="http://www.ba ...
  • SVN在提交、更新、cleanup時報錯:Problem running logsvn: Failed to run the WC DB work queue associated with 'D:\workspace\tmsdev', work item 9414 (file-install We ...
  • 摘要: 玩轉Promise。 原文: "Promise 中的三兄弟 .all(), .race(), .allSettled()" 譯者:前端小智 "Fundebug" 經授權轉載,版權歸原作者所有。 從ES6 開始,我們大都使用的是 和`Promise.race() Promise.allSett ...
  • 獲取clientWidth,可以調整表頭與列對齊(最後一列的寬度不設置) // 表格滾動 table tbody { display: block; height: 495px; overflow-y: auto; overflow-x: hidden; } // 表頭固定 table thead, ...
  • CSS 層疊樣式表 (Cascading Style Sheets)css可以用來為網頁創建樣式表,通過樣式表可以對網頁進行裝飾。所謂層疊,可以將整個網頁想象成是一層一層的結構,層次高的將會覆蓋層次低的。 而css就可以分別為網頁的各個層次設置樣式。 CSS的樣式表由一個一個的樣式構成,一個樣式又由 ...
  • js中的輪播圖案例: <!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8"> <style type="text/css"> *{ margin: 0; padding: 0; } .box{ width: 800px; heigh ...
  • 一、邊距重疊常見情況 1、垂直方向上相鄰元素的重疊 (水平方向上不會發生重疊) 2、 垂直方向上父子元素間的重疊 二、BFC 1、什麼是 BFC BFC(Block Formatting Context),即塊級格式化上下文,創建了 BFC 的元素是一個獨立的容器,裡面無論如何佈局都不會影響到外面的 ...
  • meta元素有4個屬性:name、http-equiv、content、charset.meta標簽通過name屬性來表述頁面文檔的元信息,通過http-equiv屬性設置http請求指令,通過charset設置頁面的字元編碼。按照屬性設置分類,meta可以分為三類: name屬性和content屬 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...