★06.對象

簡介

  • 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()一樣
  • ES 3 中通過如下手段模擬:
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、falsenull可以 序列化反序列化 。
    • 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()方法

  • 轉(zhuǎn)換為數(shù)字時使用。

對象的三個屬性

原型屬性

  • 原型屬性 記錄著這個對象繼承的對象。
  • 原型屬性 是在實例對象創(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é)。
最后編輯于
?著作權(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ù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容