对象是属性的容器,其中每个属性都有名字和值。
 
 
3.1. 对象字面量
 
一个对象字面量,就是包围在一对花括号中的零个或多个“名/值”对。
 
// 3.1 code 1
var empty_object = {}; var stooge = {
"first-name": "Jerome",
"last-name": "Howard"
};
 
对象可以是嵌套的:
 
// 3.1 code 2
var filght = {
airline: "Oceanic",
number: 815,
departure: {
IATA: "SYD",
time: "2004-09-22 14:55",
city: "Sydney"
},
arrival: {
IATA: "LAX",
time: "2004-09-23 10:42",
city: "Los Angeles"
}
}
 
3.2. 检索
 
检索对象里包含的值,有两种方式:[] 和 . 。
 
// 3.2 code 3
stooge["first-name"] // "Jerome"
flight.departure.IATA // "SYD"
 
检索不存在的成员属性的值,将返回 undefined 。
 
// 3.2 code 4
stooge["middle-name"] // undefined
flight.status // undefined
stooge["FIRST-NAME"] // undefined
 
用 || 运算符设置默认值:
 
// 3.2 code 5
var middle = stooge["middle-name"] || "(none)";
var status = flight.status || "unknown";
 
用 && 运算符避免错误:
 
// 3.2 code 6
flight.equipment // undefined
flight.equipment.model // throw "TypeError"
flight.equipment || flight.equipment.model // undefined
 
3.3. 更新
 
对象里的值可以通过赋值语句来更新。
 
stooge['first-name'] = "Jerome";
stooge['middle-name'] = "Lester";
flight.equipment = {
model: "Boeing 777"
};
flight.status = "overdue";
 
如果属性名存在,属性值会被替换;如果属性名不存在,这个属性会被扩展到对象中。
 
3.4. 引用
 
对象通过引用来传递。
 
// 3.4 code 8
var x = stooge;
x.nickname = "Curly";
stooge.nickname; // "Curly" var a = {}, b = {}, c = {}; // refer the diff Object
a = b = c = {}; // refer the same Object
3.5. 原型
 
所有通过字面量创建的对象都连接到 Object. prototype。
 
我们给 Object 增加一个 create 方法,用这个方法创建一个新对象,这个新对象使用原对象作为它的原型。
 
// 3.5 code 9
if (typeof Object.beget !== 'function') {
Object.create = function (obj) {
var Func = function () {};
Func.prototype = obj;
return New Func();
};
}
var new_stooge = Object.create(stooge);
 
更新原型的属性值是不可能的,只会覆盖(新添属性名在原型中已经有了)。
 
// 3.5 code 10
new_stooge['first-name'] = 'Harry';
new_stooge['middle-name'] = 'Moses';
new_stooge.nickname = 'Moses';
 
更改了原型对象,对 new_stooge 起作用了。
 
// 3.5 code 11
stooge.profession = 'actor';
new_stooge.profession // 'actor'
 
3.6. 反射
 
用 typeof 操作符确定类型。
 
// 3.6 code 12
typeof flight.number // 'number'
typeof flight.status // 'string'
typeof flight.arrival // 'object'
typeof flight.manifest // 'undefined'
 
原型中的属性类型:
 
// 3.6 code 13
typeof flight.toString // 'function'
typeof flight.constructor // 'function'
 
如果一个属性是一个对象独有的属性,用 hasOwnProperty 方法,将返回 true;如果一个属性是一个对象原型链上的属性,将返回 false。
 
// 3.6 code 14
flight.hasOwnProperty('number') // true
flight.hasOwnProperty('constructor') // false
 
3.7. 枚举
 
for in 语句会遍历一个对象中所有的属性名 ---- 包括函数和原型中的属性 ---- 现在你想过滤他们,可以用 hasOwnProperty 方法过滤原型中的属性,用 typeof 来排除函数。
 
// 3.7 code 15
var name;
for (name in new_stooge) {
if (typeof new_stooge[name] !== 'function' || !new_stooge.hasOwnProperty(name)) {
document.writeln(name + ': ' + new_stooge[name]);
}
}
 
但这种遍历出来的属性名顺序不确定。如果想确定,得用到一个数组和 for 语句。
 
// 3.7 code 16
var i;
var properties = [
'first-name',
'middle-name',
'last-name',
'profession'
];
for (i = 0; i < properties.length; i += 1) {
document.writeln(properties[i] + ': ' + new_stooge[properties[i]]);
}
3.8. 删除
 
delete 语句用来删除对象的属性。
 
// 3.8 code 17
new_stooge.nickname // 'Moe' object's value
delete new_stooge.nickname;
new_stooge.nickname // 'Curly' exposed prototype's value
 
3.9. 减少全局变量污染
 
创建一个唯一的全局变量。
 
// 3.9  code 18
var MYAPP = {};
 
这个变量变成了你应用的容器:
 
// 3.9 code 19
MYAPP.stooge = {
"first-name": "Jerome",
"last-name": "Howard"
}; MYAPP.filght = {
airline: "Oceanic",
number: 815,
departure: {
IATA: "SYD",
time: "2004-09-22 14:55",
city: "Sydney"
},
arrival: {
IATA: "LAX",
time: "2004-09-23 10:42",
city: "Los Angeles"
}
}
 
这样全局的资源纳入了一个命名空间下。
 
使用闭包来进行信息隐藏的方式,也是一种有效减少全局变量的方法。下面会讲。
 
 (完)

第三章 对象(JavaScript:语言精粹)的更多相关文章

  1. 第四章 函数(JavaScript:语言精粹)

    函数包含一组语句,用来指定对象的行为,其代码可以用来重复使用.   一般来说,编程就是将一组需求分解成一组函数和数据结构的技能.   概览:函数对象 | 函数字面量 | 调用 | 方法调用模式 | 函 ...

  2. 你想了解的《javaScript语言精粹》(三)

    # javaScript语言精粹  # 第三章 对象 - javaScript 数据类型     1. 基础数据类型         Number String Boolean Undefined N ...

  3. 《javascript语言精粹》读书笔记 Item2 对象

    第三章 对象 JavaScript的简单数据类型包括数字.字符串.布尔值(true和false).null值和undefined值.其他 数字.字符串和布尔值"貌似"对象,因为它们 ...

  4. javascript面向对象精要第三章对象整理精要

    什么是对象的数据属性?什么是对象的访问器属性?[put]方法是默认创建数据属性的,访 问器属性不包含值而是定义了一个单属性被读取时调用的函数(getter)和当一个属性被写入时 调用的函数(sette ...

  5. JavaScript中对象与函数的某些事[JavaScript语言精粹-N1]

    今天在读<JavaScript语言精粹>的时候,关于函数的一个部分,始终觉得有点难以理解,代码如下: 1: var obj = (function(){ 2: var value = 0; ...

  6. JavaScript语言精粹 笔记01 语法 对象

    内容比较简单,只是从头梳理一下JS的知识 语法空白标识符数字字符串语句 对象对象字面量检索更新引用原型反射枚举删除减少全局变量污染  语法 1 空白 空白可能表现为格式化字符或注释的形式.空白通常没有 ...

  7. 《JavaScript语言精粹》之函数化

    写在前面 看到好多书评和读书笔记都说<JavaScript语言精粹>字字珠玑,名不虚传..当然,要看得懂才行 其实个人认为函数化部分不是很好,举的例子不是十分恰当,之前看不懂是因为被成功误 ...

  8. 《JavaScript语言精粹》小记

    一.前言 以下内容均摘自<JavaScript语言精粹>一书,本人在读这本书时,发现作者诠释JavaScript很犀利,特别是数组部分,固记录下来,想和大家分享下. 随笔主要包含两大部分: ...

  9. JavaScript语言精粹(读书笔记)

    第一章 精华 1,JavaScript的函数(主要)基于词法作用域(lexical scoping)的顶级对象.强类型语言允许编译器在编译时检测错误,但弱类型很自由,无需建立复杂的类层次,不用做强制造 ...

随机推荐

  1. jsp\struts1.2\struts2 中文件上传(转)

    jsp\struts1.2\struts2 中文件上传 a.在jsp中简单利用Commons-fileupload组件实现 b.在struts1.2中实现c.在sturts2中实现现在把Code与大家 ...

  2. 将公网IP自动发到Twitter上

    [Twitter] 1. 在https://apps.twitter.com/创建新的应用 2. 在https://dev.twitter.com/rest/reference/post/status ...

  3. Codeforces Round #361 (Div. 2) C D

    C 给出一个m 此时有 四个数 分别为x k*x k*k*x k*k*k*x k大于1 x大于等于1 要求求出来一个最小的值n 使其满足 这四个数中的最大值小于n 这四个数可能的组数为m 可以看出这四 ...

  4. AJAX原理及XMLHttpRequest对象分析

    今天的主题是前端都了解的AJAX,但其中都有哪些知识点,还需要深入分析. 首先揭示AJAX的字面意思,Asynchronous Javascript And XML,通俗点就是“异步Javascrip ...

  5. 关于mac下面用Parallels装ubuntu时分辨率问题[已解决]

    最近由于要深入下Android系统,在Parallels虚拟机上安装了ubuntu系统,刚开始安装成功的时候,分辨率只有800*600.本来想着去设置里面改动呢,可是坑爹的是设置里面只有800*600 ...

  6. apple mobile device服务无法启动,错误1053 解决

    我不想安装iTunes,于是下了iTunes64安装包,解压后得到6个文件 安装完 AppleMobileDeviceSupport64.msi 发现服务启动不起来,提示错误1053,网上搜了下发现出 ...

  7. java线程生命周期及其对应方法

    http://blog.sina.com.cn/s/blog_a8aa82cc0101ktrm.html http://wenku.baidu.com/view/c242df69011ca300a6c ...

  8. LeetCode Read N Characters Given Read4 II - Call multiple times

    原题链接在这里:https://leetcode.com/problems/read-n-characters-given-read4-ii-call-multiple-times/ 题目: The ...

  9. LeetCode Read N Characters Given Read4

    原题链接在这里:https://leetcode.com/problems/read-n-characters-given-read4/ 题目: The API: int read4(char *bu ...

  10. uniq-删除重复

    uniq常用于管道中,用来删除已使用sort排序完成的重复记录. uniq有3个好用的选项: -c 可在每个输出行之前加上该行重复的次数: -d 仅显示重复的行 -u 仅显示未重复的行