標籤:

你有對象沒?沒有的話new一個。

你有對象沒?沒有的話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:計算機科學 |