JavaScript封裝對象介紹及基本封裝類型

來源:互聯網
上載者:User

JavaScript中的對象是由屬性和方法兩個基本的元素的構成的。前者是對象在實施其所需要行為的過程中,實現資訊的裝載單位,從而與變數相關聯;後者是指對象能夠按照設計者的意圖而被執行,從而與特定的函數相聯。 JavaScript對象是一種複合值:它是屬性和已命名值的集合。通過"."符號來引用屬性值。當屬性值是一個函數時,稱為方法。

①一段你常用但卻未必明白其真正底層原理的代碼:

var s = "hello world!";
var word = s.substring(s.indexOf(" ")+1,s.length);

如前面所說,這裡變數s只是一個字串原始類型,它怎麼會有屬性(s.length)和方法(s.indexOf()、s.substring())呢?沒錯,這正跟我們正要介紹的封裝對象有關。原因是:只要引用了字串s的屬性,JavaScript就會將字串值通過調用new String(s)的方式轉換成對象,這個對象繼承了字串(String)對象的方法,並被用來處理屬性的引用。一旦屬性引用結束,這個新建立的對象就會被銷毀。

  同字串一樣,數字和布爾值也有各自的方法:通過Number()和Boolean()建構函式建立一個臨時對象。存取字串、數字或布爾值的屬性時建立的臨時對象就是封裝對象。5種原始類型中的剩餘兩種null和undefined沒有封裝對象:訪問它們的屬性會造成一個類型錯誤(Uncaught TypeError)。明白了上面的代碼,那麼再看如下代碼
var s = "test";
s.len = 4;//給它設定一個屬性
var t = s.len;

  不認真的同學這裡就會認為最後t就是等於4了。難道最後t不等於4嗎?是的,最後t的值是undefined。想知道為什麼請看繼續看解析:原來以這裡第二行代碼只是建立了一個臨時字串對象,並給len屬性賦值為4,隨即銷毀這個對象。而第三行又是通過原始字串s建立一個新字串對象(這個不是第二行代碼建立的對象,第二行代碼建立的對象已經被銷毀了)並嘗試讀取其len屬相,這個屬性自然不存在,因此運算式的結果為undefined。這段代碼說明了在讀取字串、數字和布爾值的屬性值或方法(實際上是它們對應封裝對象的屬性值或方法)表現的像對象一樣。但如果你試圖給屬性賦值,則會忽略這個操作:修改只是發生在臨時對象身上,而這個臨時對象並不會繼續保留下來。

  注意:可通過String(),Number(),Boolean()建構函式來顯示建立封裝對象:

var s = "test",n=1,b=true;//一個字串、數字和布爾值
var S = new String(s);//一個字串對象
var N = new Number(n);//一個數值對象
var B = new Boolean(b);//一個布爾對象

  JavaScript會在必要時將封裝對象轉換成原始值,因此上段代碼中的對象S、N和B常常但不總是表現的和值s、n和b一樣。"=="等於運算子將原始值和其封裝對象視為相等,但“===”全等運算將它們視為不等。通過typeof運算子也可以看到原始值和其封裝對象的不同:

    ①typeof(s);  ->"string"

     typeof(S);  ->"object"

    ②typeof(n);  ->"string"

     typeof(N);  ->"object"

    ③typeof(b);  ->"string"

     typeof(B);  ->"object"



Javascript之基本封裝類型

為了便於操作基本類型值,ECMAScript還提供了三個特殊的參考型別:Boolean、Number和String。這些類型與其他參考型別相似,同時也具有與各自的基本封裝類型相應的特殊行為。實際上,每當讀取一個基本類型值時,後台就會建立一個對應的基本封裝類型的對象,從而讓我們能夠調用一些方法來操作這些資料。

var s1 = "some text";
var s2 = s1.substring(2);

    這個例子中的變數s1包含一個字串,字串當然是基本類型值。而下一行調用了s1的substring()方法,並將返回的結果儲存在s2中。我們知道,基本類型值不是對象,因此從邏輯上講,它們不應該有方法(但是它們確實有方法)。其實,為了讓我們實現這種直觀的操作,後台已經自動完成了一系列的處理。當第二行代碼訪問s1時,訪問過程處於一種讀模數式,也就是從記憶體中讀取這個字串的值。而在讀模數式中訪問字串時,後台都會自動完成下列處理:

    (1)建立String類型的一個執行個體。

    (2)在執行個體上調用指定方法。

    (3)銷毀這個執行個體。

    可以使用以下代碼錶示:

var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null;

    經過此番處理,基本的字串值就變得跟對象一樣了。而且,上面三個步驟也適用於Boolean和Number類型對應的布爾值和數字值。

    參考型別與基本封裝類型的主要區別就是對象的生命週期。使用new操作符建立的參考型別的執行個體,在執行流離開當前範圍之前都一直儲存在記憶體中。而自動建立的基本封裝類型的對象,只存在於這一行代碼的執行期(瞬間),然後立即銷毀。這就意味著我們不能在運行時為屬性添加屬性和方法。

var s1 = "some text";
s1.color = "red";
alert(s1.color); //undefined

    當然,可以顯示調用Boolean、Number和String來建立基本封裝類型的對象,不過,不幫不建議這麼做。對基本封裝類型的執行個體調用typeof會返回"object",而且所有基本封裝類型的對象都會被轉化為布爾值true。。

var obj = new Object("some text");
alert(obj instanceof String) //true

    值得注意的是,使用new調用基本封裝類型的建構函式,與直接調用同名的轉型函數是不一樣的。

var value = "25";
var number = Number(value);//轉型函數
alert(typeof number) //number
 
var obj = new Number(var); //建構函式
alert(typeof obj) //object

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.