JavaScript物件字面量和建構函式原理與用法詳解
本文例項講述了JavaScript物件字面量和建構函式。分享給大家供大家參考,具體如下:
物件中只有兩種屬性:(一種比較細的分法)
屬性(資料屬性)比如:名字,年齡,性別,出版社,地址等資訊;
方法(封裝程式碼的屬性:函式 ,在這也是一種屬性)。
在JS中物件的字面量和建構函式是非常的重點,其實在其他的語言中,是沒有物件字面量的。
一.物件的字面量的語法:
{
屬性名: 屬性值,
屬性名: 屬性值,
方法名: 你們函式
}
這個大括號括起來的整個程式碼塊就是叫做物件。
var p1 = { }
①訪問物件的屬性:
1. . 語法
物件.屬性
2. [ ] 語法
物件["屬性名"]
物件[變數] 通過外面var一個變數,這個變數型別是字串,然後在[]中直接使用變數名。
②修改屬性的值:(當這個屬性名在物件字面量中是存在的,那就是修改其值)
②修改屬性的值:(當這個屬性名在物件字面量中是存在的,那就是修改其值)
③新增屬性的值:(當這個屬性名在物件字面量中是沒有的,那就是新增其屬性名和屬性值)
修改和新增都是一下語法:
物件.屬性名 = 值
④刪除物件的屬性:
delete 物件.屬性
二.使用建構函式來建立物件:
function Person(name,sex){ var a = 10; this.name = name; this.sex = sex; this.speak = function(){ } }
現在我們new
一下:
var p1 = new Person ;
那麼我們就叫p1是一個物件,一new出來就會在堆記憶體中分配一塊記憶體空間。
那麼p1的型別就是Person.
那麼如果我們用 p1 instanceof Person
檢測會返回true,那麼 instanceof
就是測試物件型別。
在程式碼塊中,var a = 10 ;
這個語句是一個變數,變數是放在 棧記憶體 ,但當他執行完一遍這個建構函式時,這個a就消失了,也就是說這個區域性變數的生命週期是new出來到執行完建構函式最後一句的就消失了。
但是 裡面的屬性,name sex speak 這些屬性上只要p1在他們就在。
那麼現在我們再次體會一下區域性變數a的生命週期和記憶體模型中的理解:
<script> function Person(name,sex) { var a = 10; this.name = name; this.sex = sex; this.outputa = function () { console.log(a); } this.speak = function () { } } var p1 = new Person(); console.log(p1.a); p1.outputa(); </script>
結果是:
首先,var p1 = new Person();,new一下出來一個p1物件,計算機就會在堆記憶體(heap memory)中為P1選中一塊記憶體。
然後,console.log(p1.a);,這句語句執行,這句可以這麼理解①:你a在全域性變數中並沒有,只在建構函式中的區域性變數中才有,在建構函式中的區域性變數var a = 10;他會宣告提前,但是他只是提前到函式的第一行執行。這也就可以說明區域性變數,我們不能在外部使用。理解②就是函式作用域中的變數他是區域性變數,在棧記憶體分配記憶體後,當函式執行到最後一行時,他就結束生命週期。
這個undefined是JS的一種安全機制,如果物件點一個沒有生命的變數,那麼就會預設成undefined,但如果是普通的變數,就會報錯。報錯資訊是這個變數未被定義。
詳見:JavaScript記憶體模型詳解。
*注意:物件字面量的用法用 :
和 ,
建構函式的用法用 =
和 ;
那麼型別和物件之間的關係是什麼呢?
也就是比如p1和Person的關係是什麼呢?見下表:
型別 | 物件 |
---|---|
抽象 | 具體 |
其他語言中類的作用 | |
在JS中是建構函式的形式(建構函式=類) | |
命名用大坨法(首字母大寫) |
感興趣的朋友可以使用線上HTML/CSS/JavaScript程式碼執行工具:http://tools.jb51.net/code/HtmlJsRun測試上述程式碼執行效果。
更多關於JavaScript相關內容感興趣的讀者可檢視本站專題:《javascript面向物件入門教程》、《JavaScript錯誤與除錯技巧總結》、《JavaScript資料結構與演算法技巧總結》、《JavaScript遍歷演算法與技巧總結》及《JavaScript數學運算用法總結》
希望本文所述對大家JavaScript程式設計有所幫助。