咱們前面已經接觸過對象這一種數據,這一篇着重介紹一下對象的有關知識喲~瀏覽器
對象建立方法
對象的建立方法有三種:函數
1.對象字面量this
咱們前面的對象建立方法都是使用的字面量的方法建立的。spa
這樣的方式就叫作字面量,也是咱們建立對象最簡單最經常使用的方法。3d
對象裏面有屬性,屬性之間用逗號分隔,每一條屬性都有屬性名和屬性值,屬性名和屬性值之間用分號分隔。對象
2.構造函數blog
構造函數也分兩種:系統自帶的構造函數和咱們自定義的構造函數。字符串
• 系統自帶的構造函數原型
建立對象的構造函數是Object()。console
經過這條語句,咱們就建立了一個空對象。
它的做用和var obj = {};的做用是同樣的。
系統自帶的構造函數還有不少,好比Number()、String()、Boolean()、Array()這些都是構造函數。
• 自定義構造函數
自定義的構造函數是咱們平時最經常使用的一種構造函數。
構造函數也是正常的函數,咱們爲了區分它和別的正常函數,把構造函數的首字母大寫。
上面就聲明瞭一個構造函數Person。
有了構造函數以後,咱們就能夠用new操做符來建立對象了。
這樣咱們也建立了一個對象oPerson,不過如今這個對象是空對象,由於咱們的構造函數什麼都沒有寫,咱們也沒有給這個對象添加任何屬性。
另外,用new操做符建立出來的對象,儘管都是使用的同一個構造函數,可是之間是沒有關聯的。
person1 和 person2 之間沒有關係,它們兩個是單獨的對象。
咱們能夠在構造函數裏面寫一些對象天生就有的默認屬性。
固然構造函數既然是函數,那麼就能夠傳參數。
建立對象的時候,只有new纔會有this。
這裏有一個重點,爲何咱們經過new操做符能夠建立互相獨立的對象呢?
其實,當咱們用new操做符的時候,這個new在咱們的構造函數裏面隱式建立了一個this對象,而且最後返回了這個this對象,這也就是爲何咱們經過new能夠最後建立一個對象的緣由了。
若是咱們在構造函數首行手動建立一個對象,好比that對象,而後最後返回了that,那麼裏面的this就沒有用了,我麼要爲屬性賦值就要用that了。
這樣默認的name值就是scarlett。
重點:若是咱們最後返回的對象,那麼this就失效,可是若是最後顯示返回的是原始值,那麼this仍是有效的。
3.Object.create(原型)
這種方法涉及到原型的知識點了,咱們放在後面介紹原型的時候再介紹。
屬性的增刪改查
其實屬性的修改咱們前面也都接觸過了。
1.增
咱們能夠經過對象名+點+屬性名的方法來給對象添加新的屬性而且賦值。
這個時候若是咱們調用obj.age屬性的話,這個屬性並不存在,可是obj這個對象是存在的,所以瀏覽器不會報錯,只會打印undefined。
2.改
修改的操做和增長的操做實際上是同樣的,只要調用相同的屬性名而後賦一個新的值就能夠了。
3.查
其實咱們前面一直都在使用查看屬性的功能…
obj.name = ‘demo’;
console.log(obj.name);//demo
這就是查看屬性的方法。
4.刪
刪除屬性的操做咱們須要藉助delete操做符,這個操做符的做用就是來刪除屬性的。
包裝類
咱們前面提到過,原始值是不能夠改變的,只有對象纔有屬性和方法,那麼這個又是個什麼東西?
按理說這個字符串原始值是沒有屬性的,可是這裏確實能夠查看length這個屬性。
這裏就涉及到一個叫作包裝類的東西了。
咱們在調用執行這一行代碼以前,程序會自動把str包裝成一個字符串對象,在這一行代碼執行完畢以後再銷燬這個字符串對象。
這裏的str.length的str實際上是上一句的包裝好的str1,str1是對象,上面有屬性和方法,而後就能夠打印length屬性了,在執行完str.length這行代碼以後,str1這個對象就被銷燬了。
這也就是爲何咱們在執行str.length = 2;這句話以後,再打印str.length;仍是4的緣由了。
系統在執行str.length = 2這句話的時候,先建立了一個String對象,這個對象的值是‘abcd’,咱們改變的length實際上是這個隱式建立的對象的length值,並非改變了咱們的原始值str,當str.length = 2;這句代碼執行完以後,隱式建立的字符串對象就被銷燬了,因此咱們後面打印的str.length仍是4。
其餘類型的數據也是同樣的,當咱們給原始值加屬性的時候,都是先隱式包裝成對象,而後賦完屬性值以後再銷燬這個對象。