对象是属性的容器,其中每个属性都有名字和值。
 
 
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. 求最大连续bit数

    描述 功能: 求一个byte数字对应的二进制数字中1的最大连续数,例如3的二进制为00000011,最大连续2个1    输入: 一个byte型的数字    输出: 无     返回: 对应的二进制数 ...

  2. 加jdk语句

    export CLASSPATH JAVA_HOMEJAVA_HOME=/data/jdk1.8.0_65CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOM ...

  3. 自动解析URL

    function parseURL(url) { var a = document.createElement('a'); a.href = url; return { source: url, pr ...

  4. js 获取控制台的错误信息

    适合移动端调试的时候优化的报错使用.缺点是无法打印出多条记录,有方法的同学留言告诉我. <!DOCTYPE html> <html lang="en"> & ...

  5. BizTalk开发系列(三十一)配置和使用HTTP适配器

    BizTalk的主机分别进程内主机和独立主机.但由于一直使用的是进程内主机,对于独立主机的认识比较模糊,前不久在做一个BizTalk的项目的时 候,个别系统使用HTTP的方式发布Txt之类的文本的.刚 ...

  6. Android课程---布局管理器之相对布局(二)

    这次示例代码是相对布局中兄弟组件之间,设置按钮的位置,难度:*****,一定要注意有同方向和反方向之分: 1.同方向 1)layout_alignLeft 同方向左对齐 2)layout_alignR ...

  7. 运行WampServer时,提示Exception Exception in module wampmanager.exe at 000F15A0.解决办法

    出现问题:运行WampServer时,提示Exception Exception in module wampmanager.exe at 000F15A0.解决办法 出现问题原因: ①:缺少Visu ...

  8. MySQL Access denied for user root@localhost 解决方法

    今天把本地开发的项目(ThinkPHP 3.2.3)移到虚拟机上(CentOS 6.6,LNMP 1.2,MySQL 5.6.23),配置好 MySQL 之后访问首页,出现: 此时 MySQL 的用户 ...

  9. TP框架知识点

  10. JavaMail接、收邮件

    我总算把这个研究出来啦.... 不要觉得 代码有点多哈. 我们先来说发送邮箱吧,首先建立一个属性文件*.properties sys.properties server=smtp.163.com ## ...