<!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>
全部基礎課程連接:javascript
1.JavaScript基礎視頻教程總結(001-010章) 2.JavaScript基礎視頻教程總結(011-020章) 3. JavaScript基礎視頻教程總結(021-030章) 4. JavaScript基礎視頻教程總結(031-040章)html
5. JavaScript基礎視頻教程總結(041-050章) 6. JavaScript基礎視頻教程總結(051-060章) 7. JavaScript基礎視頻教程總結(061-070章) 8. JavaScript基礎視頻教程總結(071-080章)java
9. JavaScript基礎視頻教程總結(081-090章) 10. JavaScript基礎視頻教程總結(091-100章) 11. JavaScript基礎視頻教程總結(101-110章) 12. JavaScript基礎視頻教程總結(111-120章)數組
13. JavaScript基礎視頻教程總結(121-130章) 14. JavaScript基礎視頻教程總結(131-140章)函數
另外,歡迎關注個人新浪微博性能