對象的建立數組
1)字面量、2)new、3)Object.create()函數
屬性的訪問prototype
一、能夠經過點(.)或方括號([」)運算符來獲取屬性的值。運算符左側應當是一個表達式,它返回一個對象。對於點(.)來講,右側必須是一個以屬性名稱命名的簡單標識符。對於方括號來講(「)),方括號內必須是一個計算結果爲字符串的表達式,這個字符串就是屬性的名字。在ECMAScript 3中,點運算符後的標識符不能是保留字,好比,o.for或o.class是非法的,由於for是JavaScript的關鍵字,class是保留字。若是一個對象的屬性名是保留字,則必須使用方括號的形式訪問它們,好比。[ "for" ]和。[ "class"] o ECMAScript 5對此放寬了限制(包括ECMAScript 3的某些實現),能夠在點運算符後直接使用保留字。當使用方括號時,咱們說方括號內的表達式必須返回字符串。其實更嚴格地講,表達式必須返回字符串或返回一個能夠轉換爲字符串的值。在第7章裏有一些例子中的方括號內使用了數字,這狀況象是很是常見的。對象
二、假設要查詢對象。的屬性X,若是。中不存在X,那麼將會繼續在。的原型對象中查詢屬性x。若是原型對象中也沒有X,但這個原型對象也有原型,那麼繼續在這個原型對象的原型上執行查詢,直到找到X或者查找到一個原型是f1U11的對象爲止。能夠看到,對象的原型屬性構成了一個「鏈」,經過這個「鏈」能夠實現屬性的繼承。繼承
刪除屬性ip
delete運算符能夠刪除對象的屬性。它的操做數應當是一個屬性訪問表達式。讓人感到意外的是,delete只是斷開屬性和宿主對象的聯繫,而不會去操做屬性中的屬性。delete運算符只能刪除自有屬性,不能刪除繼承屬性(要刪除繼承屬性必須從定義這個屬性的原型對象上刪除它,並且這會影響到全部繼承自這個原型的對象)。原型鏈
檢測屬性字符串
一、JavaScript對象能夠看作屬性的集合,咱們常常會檢測集合中成員的所屬關係—判斷某個屬性是否存在於某個對象中。能夠經過in運算符、hasOwnPreperty()和propertyIsEnumerable()方法來完成這個工做,甚至僅經過屬性查詢也能夠作到這一點。get
二、in運算符的左側是屬性名(字符串),右側是對象。若是對象的自有屬性或繼承屬性中包含這個屬性則返回true:原型
三、對象的hasOwnProperty()方法用來檢測給定的名字是不是對象的自有屬性。對於繼承屬性它將返回false:
四、propertyIsEnumerable()是hasOwnProperty()的加強版,只有檢測到是自有屬性且這個屬性的可枚舉性(enumerable attribute)爲true時它才返回true。某些內置屬性是不可枚舉的。一般由JavaScript代碼建立的屬性都是可枚舉的
五、然而有一種場景只能使用in運算符而不能使用上述屬性訪問的方式。in能夠區分不存在的屬性和存在但值爲undefined的屬性
對象的三個屬性
一、要想檢測一個對象是不是另外一個對象的原型(或處於原型鏈中),請使用isPrototype0f()方法。例如,能夠經過p.isPrototype0f(o)來檢測P是不是o的原型.
二、對象的類屬性(class attribute)是一個字符串,用以表示對象的類型信息。ECMAScript3和ECMAScript 5都未提供設置這個屬性的方法,並只有一種間接的方法能夠查詢它。默認的toString()方法(繼承自Object.prototype)返回了以下這種格式的字符串.
Object.prototype.toString.call(o).slice(8,-1);
對象的可擴展性用以表示是否能夠給對象添加新屬性。全部內置對象和自定義對象都是顯式可擴展的,宿主對象的可擴展性是由JavaScript引擎定義的。在ECMAScript 5中,全部的內置對象和自定義對象都是可擴展的,除非將它們轉換爲不可擴展的,一樣,宿主對象的可擴展性也是由實現ECMAScript 5的JavaScript引擎定義的。
對象序列化
一、對象序列化(serialization)是指將對象的狀態轉換爲字符串,也可將字符串還原爲對象。ECMAScript 5提供T內置函數JSON.stringify()和JSON.parse()用來序列化和還原JavaScript對象。這些方法都使用JSON做爲數據交換格式,JSON的全稱是「JavaScriptObject Notation"— JavaScript對象表示法,它的語法和JavaScript對象與數組直接量的語法很是相近:
二、JSON的語法是JavaScript語法的子集,它並不能表示JavaScript裏的全部值。支持對象、數組、字符串、無窮大數字、true, false和null,而且它們能夠序列化和還原。NaN,Infinity和一Infinity序列化的結果是null,日期對象序列化的結果是JSON格式的日期字符串(參照Date.toJSON()函數),但JSON.parse()依然保留它們的字符串形態,而不會將它們還原爲原始日期對象。函數、RegExp, Error對象和undefined值不能序列化和還原。JSDN.stringify()只能序列化對象可枚舉的自有屬性。對於一個不能序列化的屬性來講,在序列化後的輸出字符串中會將這個屬性省略掉。JS0N.stringify()和JSON.parse()均可以接收第二個可選參數,經過傳入須要序列化或還原的屬性列表來定製自定義的序列化或還原操做。
對象的方法
一、hasOwnProperty(). propertyIsEnumerable()和isPrototype0f()這三個方法,以及在Object構造函數裏定義的靜態函數Object.
create()和Object.getPrototype0f()等方法須要必定了解。
二、toString()方法沒有參數,它將返回一個表示調用這個方法的對象值的字符串。在須要將對象轉換爲字符串的時候,JavaScript都會調用這個方法。好比,當使用「+"運算符鏈接一個字符串和一個對象時或者在但願使用字符串的方法中使用了對象時都會調用toString()
三、除了基本的toString()方法以外,對象都包含toLocaleString()方法,這個方法返回一個表示這個對象的本地化字符串。Object中默認的toLocaleString()方法並不作任何本地化自身的操做,它僅調用toString()方法並返回對應值。Date和Number類對toLocaleString()方法作了定製,能夠用它對數字、日期和時間作本地化的轉換。Array類的toLocaleString()方法和to5tring()方法很像,惟一的不一樣是每一個數組元素會調用toLocaleString()方法轉換爲字符串,而不是調用各自的toString()方法。
四、Object.prototype實際上沒有定義toJSON()方法,但對於須要執行序列化的對象來講,JsON.stringify()方法會調用toJSON()方法。若是在待序列化的對象中存在這個方法,則調用它,返回值便是序列化的結果,而不是原始的對象。具體示例參見Date.toJSON()。
五、value0f()方法和toString()方法很是相似,但每每當JavaScript須要將對象轉換爲某種原始值而非字符串的時候纔會調用它,尤爲是轉換爲數字的時候。若是在須要使用原始值的上下文中使用了對象,JavaScript就會自動調用這個方法。默認的value0f()方法不足爲奇,但有些內置類自定義}value0f()方法(好比Date.value0f()),9.6.3節討論如何給自定義對象類型定義value0代)方法。