簡介
JavaScript 中的對象時動態(tài)的,屬性可以增刪,當常用來模擬靜態(tài)對象以及靜態(tài)類型語言中的 結(jié)構(gòu)體 。
類 :標識對象類型的字符串。
拓展標記 :是否可以添加新屬性。
對象的種類有: 內(nèi)置對象 、 宿主對象 (由 宿主環(huán)境 定義,可以當做 內(nèi)置對象 )、 自定義對象 。
對象也是 關(guān)聯(lián)數(shù)組 、 散列 、 映射 、 字典 。
三種創(chuàng)建方式
對象直接量
var empty = {};
var abc = {
abcdef: "str", // 屬性名可以是一個標識符
"abcdef": 123, // 屬性名可以是一個字符串
"abc def": 123, // 有空格的屬性名必須是一個字符串
'abc-def': true // 有連字符的屬性名必須是一個字符串
};
new
function Point(x, y) {
this.x = x;
this.y = y;
}
var p = new Point(1, 1);
// 不需要傳入任何參數(shù)給構(gòu)造函數(shù)時,可以省略括號
new Object
new Date
Object.create()
ES 5 定義了Object.create()。
簡單示例:
var o1 = Object.create({x : 1, y : 2}); // 創(chuàng)建了o1對象,o1繼承了屬性x和y
var o2 = Object.create(null); // 創(chuàng)建了o2對象,o2不繼承任何屬性和方法
var o3 = Object.create(Object.prototype); // 創(chuàng)建了o3對象,o3和{}和new Object()一樣
function inherit(p) {
if (p === null) throw TypeError();
if (Object.create) return Object.create(p);
var t = typeof p;
if (t !== "object" && t !== "function") throw TypeError();
function f() {
}
f.prototype = p;
return new f();
}
上述中的inherit()有防止庫函數(shù)無意間修改的作用:
var o = {x : "don't change this value"};
library_function(inherit(o)); // 通過繼承時拷貝繼承的屬性,來避免意外修改了o
序列化對象
對象序列化 是指將對象的狀態(tài)轉(zhuǎn)換為字符串。
ES 5 提供了JSON.stringify()和JSON.parse()用來 序列化 和 反序列化 JavaScript 對象。
JSON.stringify()和JSON.parse()都可以接受第二個可選參數(shù),通過傳入需要 序列化 或 反序列化 的屬性列表來定制自定義的 序列化 或 反序列化 操作。
序列化 與 反序列化 的規(guī)則:
對象、數(shù)組、字符串、有限數(shù)字、true、false、null可以 序列化 和 反序列化 。
NaN、Infinity和-Infinity 序列化 結(jié)果為null。
Data對象 序列化 為 ISO 格式的日期字符串, 反序列化 為字符串,而不是Data對象。
函數(shù)、RegExp對象、Error對象和undefined不可以 序列化 或 反序列化 。
JSON.stringify()只能 序列化 對象 可枚舉 的 自有屬性 ,對于不能 序列化 的屬性會被省略。
繼承于Object的方法
toString()方法
默認的toString()并不會輸出很多有用的信息。
很多類都帶有自定義toString(),如數(shù)組、函數(shù)和Data對象等。
toLocaleString()方法
通常toLocaleString()僅僅調(diào)用toString()并返回對應(yīng)的值。
Data對象和Number對象因為有本地化的需求,所有做了定制。
數(shù)組的toLocaleString()不是調(diào)用數(shù)組的toString()并返回對應(yīng)的值,而是調(diào)用每個元素的toString()并返回對應(yīng)的值。
toJSON()方法
通常沒有定義toJSON()方法,但是如果定義了,那么JSON.stringify()會調(diào)用它。
valueOf()方法
對象的三個屬性
原型屬性
原型屬性 記錄著這個對象繼承的對象。
原型屬性 是在實例對象創(chuàng)建之前就設(shè)置好的。
在 ES 5 中,可以使用Object.getPrototypeOf()來查詢對象的 原型 。
可以使用Object.isPrototypeOf()來檢測一個對象是否是另一個的 原型 。
類屬性
簡述
對象的 類屬性 是一個字符串,用來表示對象的類型信息。
自定義對象 的 類屬性 都是Object,無法用于區(qū)分對象的類對于其它對象,如 內(nèi)置對象 的 類屬性 有所不同
沒有直接查詢這個屬性的方法,只有一種間接的查詢方法,通過提取toString()返回的字符串的第8個到倒數(shù)第2個位置之間的字符,可以使用classof()工具函數(shù):
簡單示例
function classof(o) {
if (o === null) return "Null";
if (o === undefined) return "undefined";
return Object.prototype.toString.call(o).slice(8, -1);
}
classof(null) // "Null"
classof(1) // "Number"
classof("") // "String"
classof(false) // "Boolean"
classof({}) // "Object"
classof([]) // "Array"
classof(/./) // "RegExp"
classof(new Date()) // "Date"
classof(window) // "Window" (a client-side host object)
function f() { };
classof(new f()); // "Object"
可拓展性
簡述
對象 可拓展性 用來表示是否可以給對象添加新屬性。
所有 內(nèi)置對象 和 自定義對象 都是顯式可拓展的, 宿主對象 的 可拓展性 則由 JavaSctipt引擎 定義。
Object.preventExtensions():
用于將對象從可拓展轉(zhuǎn)換為不可拓展。
此操作不可逆。
盡管此對象轉(zhuǎn)換為不可拓展后,不能直接添加屬性,但是如果給其 原型對象 添加屬性,這個對象依舊會繼承新添加的 繼承屬性 。
可以使用Object.isExtensible()來檢測對象的 可拓展性 。
Object.seal():
用于將對象從可拓展轉(zhuǎn)換為不可拓展, 且 所有 自有屬性 都設(shè)置為不可配置。
此操作不可逆。
可以使用Object.isSealed()來檢測對象是否封閉。
Object.freeze():
用于將對象從可拓展轉(zhuǎn)換為不可拓展、所有 自有屬性 都設(shè)置為不可配置, 且 所有 自有數(shù)據(jù)屬性 都設(shè)置為只讀, 存取器屬性 依然可寫。
此操作不可逆。
可以使用Object.isFrozen()來檢測對象是否凍結(jié)。
最后編輯于 :2017.12.08 07:55:40
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者 【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。 平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。