JavaScript基礎視頻教程總結(061-070章)

来源:https://www.cnblogs.com/iflygofy/archive/2018/12/18/10137472.html
-Advertisement-
Play Games

所有基礎課程鏈接: 1.JavaScript基礎視頻教程總結(001-010章) 2.JavaScript基礎視頻教程總結(011-020章) 3. JavaScript基礎視頻教程總結(021-030章) 4. JavaScript基礎視頻教程總結(031-040章) 5. JavaScript基 ...


<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>061-070章總結</title>
</head>
<body>
    
<pre>
061. this
解析器在調用函數每次都會向函數內部傳遞進一個隱含的參數,
這個隱含的參數就是this,this指向的是一個對象,
這個對象我們稱為函數執行的 上下文對象,
根據函數的調用方式的不同,this會指向不同的對象
1.以函數的形式調用時,this永遠都是window
2.以方法的形式調用時,this就是調用方法的那個對象
</pre>
<script type="text/javascript">
    console.log("第061");
    
    function fun61(){
        console.log(this.name)
    }
    // 以函數形式調用,this是window
    fun61()
    var obj611 ={
        name:'obj611',
        sayName:fun61
    }
    var obj612 ={
        name:'obj612',
        sayName:fun61
    }
    console.log(obj611.sayName == fun61); // true
    var name = "全局name"
    // 以方法的形式調用,this是調用方法的對象
    obj611.sayName()
</script>

<pre>
062. this的補充
</pre>
<script type="text/javascript">
    console.log("第062")
    
    var age ="全局age"
    function fun62(){
        console.log(this.name)
    }
    var obj621 ={
        name:'obj621',
        sayName:fun62
    }
    var obj622 ={
        name:'obj622',
        sayName:fun62
    }
    obj621.sayName()
</script>

<pre>
063. 使用工廠方法創建對象
通過該方法可以大批量的創建對象
</pre>
<script type="text/javascript">
    console.log("第063");
    
    function createPerson(name,age,gender){
        //創建一個新的對象 
        var obj = new Object()
        //向對象中添加屬性
        obj.name = name
        obj.age = age
        obj.gender = gender
        obj.sayName = function(){
            console.log(this.name)
        }
        //將新的對象返回
        return obj
    }
    var obj631 = createPerson("阿三",18,"")
    obj631.sayName()
</script>

<pre>
064. 構造函數
創建一個構造函數,專門用來創建Person對象的
構造函數就是一個普通的函數,創建方式和普通函數沒有區別,
不同的是構造函數習慣上首字母大寫
構造函數和普通函數的區別就是調用方式的不同
普通函數是直接調用,而構造函數需要使用new關鍵字來調用
構造函數的執行流程:
1.立刻創建一個新的對象
2.將新建的對象設置為函數中this,在構造函數中可以使用this來引用新建的對象
3.逐行執行函數中的代碼
4.將新建的對象作為返回值返回

使用同一個構造函數創建的對象,我們稱為一類對象,也將一個構造函數稱為一個類。
 我們將通過一個構造函數創建的對象,稱為是該類的實例

this的情況:
1.當以函數的形式調用時,this是window
2.當以方法的形式調用時,誰調用方法this就是誰
3.當以構造函數的形式調用時,this就是新創建的那個對象
</pre>
<script type="text/javascript">
    console.log("第064");
    
    function Person01(name,age,gender){
        this.name = name
        this.age = age
        this.gender = gender
        this.sayName = function(){
            console.log(this.name)
        }
    }
    var zhangSan = new Person01("張三",30,"")
    zhangSan.sayName()
    // 使用instanceof可以檢查一個對象是否是一個類的實例
    console.log(zhangSan instanceof Person01)
    // 所有的對象都是Object的後代
    console.log(zhangSan instanceof Object)
</script>

<pre>
065. 構造函數修改
</pre>
<script type="text/javascript">
    console.log("第065");
    /*
     * 創建一個Person構造函數
     *  - 在Person構造函數中,為每一個對象都添加了一個sayName方法,
     *      目前我們的方法是在構造函數內部創建的,
     *          也就是構造函數每執行一次就會創建一個新的sayName方法
     *      也是所有實例的sayName都是唯一的。
     *      這樣就導致了構造函數執行一次就會創建一個新的方法,
     *          執行10000次就會創建10000個新的方法,而10000個方法都是一摸一樣的
     *          這是完全沒有必要,完全可以使所有的對象共用同一個方法
     */
    function Person02(name,age,gender){
        this.name = name
        this.age = age
        this.gender = gender
    }
    // 向原型中添加sayName方法
    Person02.prototype.sayName = function(){
        console.log("我是" + this.name)
    }
    var liSi = new Person02("李四",25,"")
    liSi.sayName();
</script>

<pre>
066. 原型對象
原型 prototype
我們所創建的每一個函數,解析器都會向函數中添加一個屬性prototype
這個屬性對應著一個對象,這個對象就是我們所謂的原型對象
如果函數作為普通函數調用prototype沒有任何作用
當函數以構造函數的形式調用時,它所創建的對象中都會有一個隱含的屬性,
指向該構造函數的原型對象,我們可以通過__proto__來訪問該屬性
原型對象就相當於一個公共的區域,所有同一個類的實例都可以訪問到這個原型對象,
我們可以將對象中共有的內容,統一設置到原型對象中。
當我們訪問對象的一個屬性或方法時,它會先在對象自身中尋找,如果有則直接使用,
如果沒有則會去原型對象中尋找,如果找到則直接使用
以後我們創建構造函數時,可以將這些對象共有的屬性和方法,統一添加到構造函數的原型對象中,
這樣不用分別為每一個對象添加,也不會影響到全局作用域,就可以使每個對象都具有這些屬性和方法了
</pre>
<script type="text/javascript">
    console.log("第066");
    
    function MyClass(){
        
    }
    MyClass.prototype.a = "prototype的a"
    MyClass.prototype.sayHello = function(){
        console.log("hello")
    }
    
    var mc01 = new MyClass()
    console.log(MyClass.prototype)
    console.log(mc01.__proto__ == MyClass.prototype)
    mc01.a = "mc01的a"
    console.log(mc01)
    mc01.sayHello()
</script>

<pre>
067. 原型對象2
原型對象也是對象,所以它也有原型,
當我們使用一個對象的屬性或方法時,會現在自身中尋找,
自身中如果有,則直接使用,
如果沒有則去原型對象中尋找,如果原型對象中有,則使用,
如果沒有則去原型的原型中尋找,直到找到Object對象的原型,
Object對象的原型沒有原型,如果在Object原型中依然沒有找到,則返回undefined
</pre>
<script type="text/javascript">
    console.log("第067");
    
    function MyClass02(){
        
    }
    MyClass02.prototype.name = "prototype的name"
    var mc02 = new MyClass02()
    mc02.age = 18
    // 使用in檢查對象中是否含有某個屬性時,如果對象中沒有但是原型中有,也會返回true
    console.log(mc02)
    console.log("name" in mc02) // true
    //可以使用對象的hasOwnProperty()來檢查對象自身中是否含有該屬性
    console.log(mc02.hasOwnProperty("age")) // true
    console.log(mc02.hasOwnProperty("name")) // false
    console.log(mc02.hasOwnProperty("hasOwnProperty")) // false
    
    console.log( mc02.__proto__.hasOwnProperty("hasOwnProperty") ) // false
    console.log( mc02.__proto__.__proto__.hasOwnProperty("hasOwnProperty") ) // true
    console.log( mc02.__proto__.__proto__.__proto__ ) // null
    
    console.log(MyClass02)
    console.log(MyClass02.hasOwnProperty("name")) // true
    console.log(MyClass02.hasOwnProperty("toString")) // false
    console.log(MyClass02.hasOwnProperty("hasOwnProperty")) // false
    console.log(Object)
    console.log(Object.hasOwnProperty("hasOwnProperty")) // false
    console.log(Object.prototype.hasOwnProperty("hasOwnProperty")) // true
</script>

<pre>
068. toString()
當我們直接在頁面中列印一個對象時,事件上是輸出的對象的toString()方法的返回值
如果我們希望在輸出對象時不輸出[object Object],可以為對象添加一個toString()方法
</pre>
<script type="text/javascript">
    console.log("第068");
    
    function Person03(name,age,gender){
        this.name = name
        this.age = age
        this.gender = gender
    }
    console.log(Person03)
    // 修改Person03原型的toString
    Person03.prototype.toString = function(){
        return "Person03 [ name=" +this.name +" ,age= "+this.age +",gender= " + this.gender +"]"
    }
    
    var wangSan = new Person03("王三",20,"")
    var result = wangSan.toString()
    console.log(result)
</script>

<pre>
069. 垃圾回收
垃圾回收(GC:garbage collection)
- 就像人生活的時間長了會產生垃圾一樣,程式運行過程中也會產生垃圾
這些垃圾積攢過多以後,會導致程式運行的速度過慢,
所以我們需要一個垃圾回收的機制,來處理程式運行過程中產生垃圾
- 當一個對象沒有任何的變數或屬性對它進行引用,此時我們將永遠無法操作該對象,
此時這種對象就是一個垃圾,這種對象過多會占用大量的記憶體空間,導致程式運行變慢,
所以這種垃圾必須進行清理。
- 在JS中擁有自動的垃圾回收機制,會自動將這些垃圾對象從記憶體中銷毀,
我們不需要也不能進行垃圾回收的操作
- 我們需要做的只是要將不再使用的對象設置null即可
</pre>
<script type="text/javascript">
    console.log("第069");
    
    var obj69 = new Object();
    //對對象進行各種操作
    obj69 = null;
    console.log(obj69)
</script>

<pre>
070. 數組簡介
數組(Array)
- 數組也是一個對象
- 它和我們普通對象功能類似,也是用來存儲一些值的
- 不同的是普通對象是使用字元串作為屬性名的,
而數組時使用數字來作為索引操作元素
索引:
從0開始的整數就是索引
- 數組的存儲性能比普通對象要好,在開發中我們經常使用數組來存儲一些數據
</pre>
<script type="text/javascript">
    console.log("第070");
    //創建數組對象
    var arr = new Array()
    // 使用typeof檢查一個數組時,會返回object
    console.log(typeof arr)
    console.log(arr instanceof Object) // true
    console.log(arr instanceof Function) //false
    //向數組中添加元素  語法:數組[索引] = 值
    arr[0] = 0
    arr[1] = 1
    arr[5] = 5
    arr[10] = 10
    // 讀取數組中的元素 語法:數組[索引]  如果讀取不存在的索引,他不會報錯而是返回undefined
    console.log(arr[1])
    console.log(arr[2]) // undefined
    // 可以使用length屬性來獲取數組的長度(元素的個數) 語法:數組.length
    // 對於連續的數組,使用length可以獲取到數組的長度(元素的個數)
    // 對於非連續的數組,使用length會獲取到數組的最大的索引+1 , 儘量不要創建非連續的數組
    console.log("arr長度= " + arr.length) // 11
    // 如果修改的length大於原長度,則多出部分會空出來
    // 如果修改的length小於原長度,則多出的元素會被刪除
    arr.length = 20
    console.log(arr.length) // 20
    console.log(arr) // [0, 1, empty × 3, 5, empty × 4, 10, empty × 9]
    //向數組的最後一個位置添加元素
    //語法:數組[數組.length] = 值;
    arr[arr.length] = 70
    console.log(arr) // [0, 1, empty × 3, 5, empty × 4, 10, empty × 9, 70]
    arr[arr.length] = 80
    console.log(arr) // [0, 1, empty × 3, 5, empty × 4, 10, empty × 9, 70, 80]
</script>

</body>
</html>

 

所有基礎課程鏈接:


 1.JavaScript基礎視頻教程總結(001-010章)           2.JavaScript基礎視頻教程總結(011-020章)          3. JavaScript基礎視頻教程總結(021-030章)        4. JavaScript基礎視頻教程總結(031-040章)

5. JavaScript基礎視頻教程總結(041-050章)           6. JavaScript基礎視頻教程總結(051-060章)         7. JavaScript基礎視頻教程總結(061-070章)        8. JavaScript基礎視頻教程總結(071-080章)

9. JavaScript基礎視頻教程總結(081-090章)          10. JavaScript基礎視頻教程總結(091-100章)        11. JavaScript基礎視頻教程總結(101-110章)        12. JavaScript基礎視頻教程總結(111-120章)

13. JavaScript基礎視頻教程總結(121-130章)        14. JavaScript基礎視頻教程總結(131-140章)


 另外,歡迎關註我的新浪微博


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

-Advertisement-
Play Games
更多相關文章
  • 這篇文章主要介紹了react-redux中connect的裝飾器用法@connect詳解,寫的十分的全面細緻,具有一定的參考價值,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。 通常我們需要一個reducer和一個action,然後使用connect來包裹你的Component。假設你 ...
  • 本次為大家分享一篇解決vue多個路由共用一個頁面的問題,寫的十分的全面細緻,具有一定的參考價值,對此有需要的朋友可以參考學習下。如有不足之處,歡迎批評指正。 在日常的vue開發中我們可能會遇見多個路由需要共用一個頁面的需求,特別是當路由是通過動態添加的,不同的路由展示的東西只是數據不同其他沒有變化。 ...
  • 偽類after、before的使用 ::before//偽元素 :hover//偽類 #all::after{ display:table; clear:both; content:""; } #all::after:在all裡面的最後添加一個虛擬的子元素after a:hover:帶偽類別的a標簽 ...
  • 最近在學習JavaScript基礎,在學習到面向對象編程時,學習到在JavaScript中實現模塊化的方法,其中一個重要的點是如何封裝私有變數。 實現封裝私有變數的方法主要是: 在立即執行函數中,重點在於createStringBuilder這個函數,這個函數實現了內外對接的介面,對內保護了Stri ...
  • 111 ...
  • 居然第一次遇到這種問題,還想了半天到底是怎麼回事,為什麼明明div設置寬度了,裡面的文字超過寬度後居然不換行。 (1)word-break屬性,可以讓瀏覽器實現在任意位置換行。 normal:使用瀏覽器預設的換行規則 break-all:允許在單詞內換行,效果如下: keep-all:只能在半形空格 ...
  • 需要在最後重置一下輪播 ...
  • 先看下這段代碼: 解析: 1、JSX全稱JavaScript XML,在js中寫XML標簽,是javascript的一種擴展語法。JSX標簽語法既不是字元串也不是 HTML,在編譯之後,JSX 其實會被轉化為普通的 JavaScript 對象,描述要顯示的UI信息。 JSX的編譯過程如圖所示: 2、 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...