对象是属性的容器,其中每个属性都有名字和值。
 
 
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. MySQL数据库相关命令

    1.命令:show create table 表名 功能:获取建表语句 2.命令:desc 表名 功能:展示表字段及其类型

  2. 一篇很全面的freemarker教程

    以下内容全部是网上收集: FreeMarker的模板文件并不比HTML页面复杂多少,FreeMarker模板文件主要由如下4个部分组成:1,文本:直接输出的部分2,注释:<#-- ... --& ...

  3. Java MD5加密算法学习

    MD5,即"Message-Digest Algorithm 5(信息-摘要算法)",它由MD2.MD3.MD4发展而来的一种单向函数算法(也就是HASH算法),它是国际著名的公钥 ...

  4. c# 文件遍历

    DirectoryInfo TheFolder=new DirectoryInfo(folderFullName); //遍历文件夹 foreach(DirectoryInfo NextFolder ...

  5. Install MySQL on Mac by Homebrew

    1.  安装mysql brew update brew install mysql 2. 启动mysql mysql.server start 3. 登录mysql mysql -uroot -p ...

  6. Maven应用

    Maven进行项目管理很方便,下面介绍一下学习maven中的笔记.我是在Windows上运行的          有些知识点没有试,只是收集转载,很可能存在错误 1.安装 解压缩之后,配置环境变量MA ...

  7. http://www.cnblogs.com/ACMer/p/5170255.html

    http://www.cnblogs.com/ACMer/p/5170255.html

  8. *BigDecimal初识

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处 理16位有效数.在实际应用中,需要对更大或者更小的数进 ...

  9. RDIFramework.NET V2.9版本多语言的实现

    RDIFramework.NET V2.9版本多语言的实现 现在是国际化时代,软件也不能落后.一个公司里很可能会有老外,也可能有台湾的朋友,他们用软件的习惯都不一样,若同样一个软件同时能适应多种语言文 ...

  10. 关于Thread.getContextClassLoader的使用场景问题

    Thread context class loader存在的目的主要是为了解决parent delegation机制下无法干净的解决的问题.假如有下述委派链: ClassLoader A -> ...