你有對象沒?沒有的話new一個。
來自專欄 Habitat Growing Way1 人贊了文章
JavaScript是一門輕量型的腳本語言,JavaScript語言的重要思想是面向對象。
你可以不必深究什麼是輕量型的腳本語言,但是你一定要知道有關於面向對象。
說面向對象你可能雲里霧裡,但是翻譯成英語:Object Oriented Programming 譯成以對象為主導的編程語法,相信能好理解一點。
通俗來說,就是你在使用這門語言時,多數時間是對對象進行操作,傳說有一句話說是:everything can be seen as an object in JavaScript. 任何東西在JS中都可以當作對象,我剛開始學的時候蒙蔽了,對象這麼牛逼么 - -,後來發現學習到的數據類型,DOM,jQuery等等,都是基於鍵值對這樣基礎的數據結構,真的牛逼。
1.說了這麼久,你知道什麼是對象了么?(對象是什麼,為什麼有對象)
① 對象可以看作是單個實物的抽象② 對象可以視作是一種容器,是對於屬性和行為的封裝
①:現實世界和計算機世界是不同的兩個世界,但是如果非要把現實世界置於計算機的角度去考量,就需要把現實的東西比如說是一本書、一輛車抽象成計算機世界中的一個什麼東西,但是現實世界的東西太多了,都在js中存成對象。
②:現實的東西都有屬性,不管是靜態的還是動態的,抽象出來東西也能很好的表現他們,所以對象也會有屬性,來表示我這是什麼對象,能有什麼用。
var car1 = { id:1, type:BigCar, value:10, age:10,} //這一對象就可以視為是對現實中的一輛車的抽象 //其中,就是中括弧,加上鍵值對,嗯,就能叫做對象了。
2.知道了什麼是對象,但是如果有很多很多類似的汽車,那我需要一個一個手寫他們嗎?(強行引入構造函數)
當然如果有很多車你也可以一個一個手寫他們,但是我們得欺騙自己,自己是程序員,很懶的那種,用手寫10000輛車,不寫傻了么。
因為對象是單個實物的抽象===>通常需要一個模板,表示某一類實物的共同特徵,然後通過模板生成===>又因為JS中沒有類的概念===>所以使用 構造函數 + 原型鏈(之後講)
2.1接下來介紹構造函數(構造函數是什麼)
這樣的過度意外么?
上面是介紹了什麼是對象===>緊接著是怎麼生成對象?
構造函數是用來專門生成實例對象的函數.
qtm這不是瞎忙活,聽得懂么?
function 汽車(id){ this.id = id}
這是一個簡單的構造函數?我去,這就是構造函數了?
2.2構造函數的特點:(構造函數的特點)
①:內部使用了一個this關鍵字,代表了索要生成對象實例
②:生成對象時,必須使用new關鍵字。
就是說符合上面兩個特點的函數就是一個構造函數,這麼說好像是能理解一點。
3.生成對象必須使用new關鍵字===>詳解一下new
new 關鍵字的作用是:執行一個構造函數,返回一個對象,這個對象要麼是實例對象,要麼是return語句指定的對象
背下來!
new 關鍵字的作用是:執行一個構造函數,返回一個對象這個對象要麼是實例對象,要麼是return語句指定的對象。
再來一遍:
new關鍵字的作用是:執行一個構造函數,返回一個對象,這個對象要麼是實例對象,要麼是return語句指定的對象。
舉個例子:
function 汽車(id){ var temp = {} //1.建立一個臨時對象,最用用來得到這個對象 this = temp //2.將對象賦值給函數內部的this關鍵字,此時this就是這個空對象 汽車.共有屬性 = { 製造廠家:汽車(構造函數) } // 3.告訴別人我的製造廠家是誰 this.__proto__ = 汽車.prototype // 4.我這個空對象繼承的屬性是從哪裡來的 this.id = id //5.我的自有屬性里有一個id是可以傳進來的 return this //6.最後返回一個對象}汽車.公有屬性 = { //7.公有屬性業界就叫做 prototype 製造廠家:汽車(構造函數) 前進:fn(){}, 剎車:fn(){}, ...}var 汽車a = new 汽車(1)console.log(汽車a)汽車{id:1} id:1 __proto__: constructor:f F(id), 前進:f(), 剎車:f(), __proto__:Object
但是如果一個new我們要這麼麻煩,誰還用它呢?用的人是不是灑?
最後JS之父為了更多人能夠喜歡用new,貼心設計了語法糖
function 汽車(id){ //var temp = {} //1.建立一個臨時對象,最用用來得到這個對象 我幫你搞定 //this = temp //2.將對象賦值給函數內部的this關鍵字,此時this就是這個空對象 我幫你搞定 //汽車.共有屬性 = { 製造廠家:汽車(構造函數) } // 3.告訴別人我的製造廠家是誰 我幫你搞定 //this.__proto__ = 汽車.prototype // 4.我這個空對象繼承的屬性是從哪裡來的 我幫你搞定 this.id = id //5.我的自有屬性里有一個id是可以傳進來的 我幫你搞定 //return this //6.最後返回一個對象 我幫你搞定}汽車.prototype = { //7.公有屬性業界就叫做 prototype 我幫你定義 製造廠家:汽車(構造函數) 前進:fn(){}, 剎車:fn(){}, ...}
所以我們只需要做的是在構造函數里寫上自有屬性,在原型上寫上公有屬性。就這麼簡單
function 汽車(id) { this.id = id }汽車.prototype = { 製造廠家:汽車(構造函數) 前進:fn(){}, 剎車:fn(){}, ...}var 汽車a = new 汽車(1)
是不是很簡單,最後總結一下new究竟做了啥?
1.我幫你創建一個空對象
2.將這個空對象賦值給函數內部的this關鍵字
3.我再幫你綁定原型
===>把空對象的原型指向構造函數的prototype屬性
===>這樣就可以使用內存中的公有屬性避免浪費
===>空對象.__proto === 構造函數.prototype 所以空對象能繼承構造函數的屬性和方法
4.執行內部的代碼
5.返回一個對象:如果函數內部沒有return 新對象,就返回this對象;如果return 新對象,就返回該新對象。
最後要區分一下:
var a = Number(1) //typeof a === Number true var a = new Number(1) //typeof a === Object true var b = Object() //typeof b === Object true var b = new Object() //typeof b === Object true 始終記住,new關鍵字執行構造函數返回一個對象,要麼是實例對象,要麼是return指定的對象.
作業:
1.背誦new關鍵字的作用
2.new 幫你做了那些內容
推薦閱讀:
※C++性能榨汁機之局部性原理
※用Python實現模擬登錄正方教務系統搶課
※用CDH5搭建hadoop集群
※HTTP和HTTPS
TAG:計算機科學 |