★06.对象

简介

  • JavaScript 中的对象时动态的,属性可以增删,当常用来模拟静态对象以及静态类型语言中的 结构体
  • :标识对象类型的字符串。
  • 拓展标记 :是否可以添加新属性。
  • 对象的种类有: 内置对象宿主对象 (由 宿主环境 定义,可以当做 内置对象 )、 自定义对象
  • 对象也是 关联数组散列映射字典

三种创建方式

对象直接量

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);

// 不需要传入任何参数给构造函数时,可以省略括号
new Object
new Date

Object.create()

  • ES 5 定义了Object.create()
  • 简单示例:
var o1 = Object.create({x : 1, y : 2});     // 创建了o1对象,o1继承了属性x和y
var o2 = Object.create(null);               // 创建了o2对象,o2不继承任何属性和方法
var o3 = Object.create(Object.prototype);   // 创建了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()有防止库函数无意间修改的作用:
var o = {x : "don't change this value"};
library_function(inherit(o));           // 通过继承时拷贝继承的属性,来避免意外修改了o

序列化对象

  • 对象序列化 是指将对象的状态转换为字符串。
  • ES 5 提供了JSON.stringify()JSON.parse()用来 序列化反序列化 JavaScript 对象。
  • JSON.stringify()JSON.parse()都可以接受第二个可选参数,通过传入需要 序列化反序列化 的属性列表来定制自定义的 序列化反序列化 操作。
  • 序列化反序列化 的规则:
    • 对象、数组、字符串、有限数字、truefalsenull可以 序列化反序列化
    • NaNInfinity-Infinity 序列化 结果为null
    • Data对象 序列化ISO 格式的日期字符串, 反序列化 为字符串,而不是Data对象。
    • 函数、RegExp对象、Error对象和undefined不可以 序列化反序列化
    • JSON.stringify()只能 序列化 对象 可枚举自有属性 ,对于不能 序列化 的属性会被省略。

继承于Object的方法

toString()方法

  • 默认的toString()并不会输出很多有用的信息。
  • 很多类都带有自定义toString(),如数组、函数和Data对象等。

toLocaleString()方法

  • 通常toLocaleString()仅仅调用toString()并返回对应的值。
  • Data对象和Number对象因为有本地化的需求,所有做了定制。
  • 数组的toLocaleString()不是调用数组的toString()并返回对应的值,而是调用每个元素的toString()并返回对应的值。

toJSON()方法

  • 通常没有定义toJSON()方法,但是如果定义了,那么JSON.stringify()会调用它。

valueOf()方法

  • 转换为数字时使用。

对象的三个属性

原型属性

  • 原型属性 记录着这个对象继承的对象。
  • 原型属性 是在实例对象创建之前就设置好的。
  • ES 5 中,可以使用Object.getPrototypeOf()来查询对象的 原型
  • 可以使用Object.isPrototypeOf()来检测一个对象是否是另一个的 原型

类属性

简述

  • 对象的 类属性 是一个字符串,用来表示对象的类型信息。
  • 自定义对象类属性 都是Object,无法用于区分对象的类对于其它对象,如 内置对象类属性 有所不同
  • 没有直接查询这个属性的方法,只有一种间接的查询方法,通过提取toString()返回的字符串的第8个到倒数第2个位置之间的字符,可以使用classof()工具函数:

简单示例

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"

可拓展性

简述

  • 对象 可拓展性 用来表示是否可以给对象添加新属性。
  • 所有 内置对象自定义对象 都是显式可拓展的, 宿主对象可拓展性 则由 JavaSctipt引擎 定义。
  • Object.preventExtensions()
    • 用于将对象从可拓展转换为不可拓展。
    • 此操作不可逆。
    • 尽管此对象转换为不可拓展后,不能直接添加属性,但是如果给其 原型对象 添加属性,这个对象依旧会继承新添加的 继承属性
    • 可以使用Object.isExtensible()来检测对象的 可拓展性
  • Object.seal()
    • 用于将对象从可拓展转换为不可拓展, 所有 自有属性 都设置为不可配置。
    • 此操作不可逆。
    • 可以使用Object.isSealed()来检测对象是否封闭。
  • Object.freeze()
    • 用于将对象从可拓展转换为不可拓展、所有 自有属性 都设置为不可配置, 所有 自有数据属性 都设置为只读, 存取器属性 依然可写。
    • 此操作不可逆。
    • 可以使用Object.isFrozen()来检测对象是否冻结。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354

推荐阅读更多精彩内容