对象是属性的容器,其中每个属性都有名字和值。
 
 
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. find xargs exec rm

    有时候比如我们删除上万行的文件种的几千行需要怎么做呢 如果配合find 和exec 因为exec有个内存溢出的可能所以一般都会有控制. 例如: find . -name *.log -exec rm ...

  2. Javascript算术运算

    Javascript中Math对像的一些复杂算术运算方法: Math.pow(2,53)  //2的53次幂 结果:9007199254740992 Math.round(0.6)  //0.6四舍五 ...

  3. DataTable to byte[]、DataTable to XML(string)

    DataTabe 对象在很多地方都会用到,特别是在Web Service.Socket等需网络传输的地方. 但是在有些地方,如果直接传递的话,程序可能会报告DataTable无法序列化错误. 解决问题 ...

  4. 20145337《JAVA程序设计》第一周学习总结

    # 20145337 <Java程序设计>第1周学习总结 ## 教材学习内容总结 第一章 -Java最早是Sun公司撰写Star7应用程序的程序语言 -根据应用领域不同,有Java SE. ...

  5. jquery send(data) 对data的处理

    // Convert data if not already a string if ( s.data && s.processData && typeof s.dat ...

  6. win7安装virtualbox遇到的问题

    今天用台式机的时候想装个virtualbox跑centos做测试用,结果centos始终装不上,vbox一直提示无法开启任务.重装vbox,以及手动点击安装xxx.inf文件,都不行. 以前用的win ...

  7. kuohao

    #include <stdio.h> int b[50]; int a[50]; int w[50]; int main() { freopen("in.txt",&q ...

  8. 使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析

    使用所见即所得文本编辑器编辑文本存入数据库后通过ajax获取服务器json_encode的数据到前台,文本内容上边的html标签不解析 因为我在前台使用了jquery的text()方法,而不是html ...

  9. Qt字符串类——1.字符串常用的几种操作

    字符串有如下几个操作符: (1)QString提供了一个二元的"+"操作符用于组合两个字符串,并提供了一个"+="操作符用于将一个字符串追加到另一个字符串的末尾 ...

  10. Python开发【第三章】:Python的文件操作

    一.文件操作模式概述 1.打开文件的模式: r, 只读模式[默认] w,只写模式[不可读:不存在则创建:存在则删除内容:] a, 追加模式[不可读:不存在则创建:存在则只追加内容:] 2." ...