所有基礎課程鏈接: 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章)
另外,歡迎關註我的新浪微博