犀牛——第6章对象6.2属性的查询和设置
2015-07-23 22:10
232 查看
6.2属性的查询和设置
可以通过(.)或方括号([])运算符来获取属性的值。运算符左侧应该是一个表达式,它返回一个对象。对于点(.)来说,右侧必须是一个以属性名称命名的简单标识符。对于方括号来说([]),方括号内必须是一个计算结果为字符串的表达式,这个字符串就是属性的名字:var author = book.author; //得到book的“author”属性
var name = author.surname //得到获得author的“surname”属性
var title = book["main title"] //得到book的“main title”属性
和查询属性值的写法一样,通过点和方括号也可以创建属性或给属性赋值,但需要将它们放在赋值表达式的左侧:
book.edition = 6; //给book创建一个名为“edition”的属性
book["main title"] = "ECMAScript"; //给“main title”属性赋值
6.2.1 作为关联数组的对象
object.propertyobject["property"]
这种数组就是我们所说的关联数组,也称做散列、映射或字典。JavaScript对象都是关联数组。
例子:
var addr = "";
for(i = 0; i < 4; i++){
addr += customer["address"+i]+'\n';
}
这段代码读取customer对象的address0、address1、address2、address3属性,并将它们连接起来。
例子:
给portfolio添加新的股票:
function addstock(portfolio,stockname,shares){
portfolio["stockname"] = shares;
}
计算portfolio的总价值:
function getvalue(portfolio){
var total = 0.0;
for(stock in portfolio){ //遍历portfolio中的每只股票
var shares = portfolio[stock]; //得到每只股票的份额
var price = getquote(stock); //查询股票价格
total +=shares * price; //将结果累加到total中
}
return total; //返回total的值
}
6.2.2 继承
只有在查询属性时才会体会到继承的存在,而设置属性则和继承无关,这是JavaScript的一个重要特性,该特性让程序员可以有选择的覆盖继承的属性。例子:
var o = {} //o从Object.prototype继承对象的方法
o.x = 1; //给o定义一个属性x
var p = inherit(0); //p继承o和Object.prototype
p.y = 2; //给p定义一个属性y
var q = inherit(p); //q继承p、o和Object.prototype
q.z = 3; //给q定义一个属性z
var s = q.toString(); //toString继承自Object.prototype
q.x + q.y //=>3:x和y分别继承自o和p
例子:
var unitcircle = {r:1}; //一个用来继承的对象
var c = inherit(unitcircle); //c继承属性r
c.x = 1;
c.y = 1; //c定义两个属性
c.r = 2; //c覆盖继承来的属性
unitcircle.r; //=>1,原型对象没有修改
6.2.3 属性访问错误
查询一个不存在的属性并不会报错,如果在对象o自身的属性或继承的属性中均未找到属性x,属性访问表达式o.x返回undefined。book.subtitle; //=>undefined:属性不存在
但是,如果对象不存在,那么试图查询这个不存在的对象的属性就会报错。
//抛出一个类型错误异常,undefined没有length属性
var len = book.subtitle.length;
提供了两种避免出错的方法:
//一种冗余但很易懂的方法
var len = undefined;
if(book){
if(book.subtitle) len = book.subtitle.length;
}
//一种更简练的常用方法,获取subtitle的length属性或undefined
var len = book && book.subtitle && book.subtitle.length;
相关文章推荐
- 图的邻接表表示法及深度搜索与广度搜索
- 给出a的定义 -- 指针 和 数组
- ioremap 函数映射操作已知的物理地址(寄存器、端口、IO)
- 关于hibernate插入mysql数据库中文数据乱码处理
- eclipse中SVN分支合并到主干
- OX01: Web Speder 入门
- 原生 or 混合 ? 关于应用永不停息的争论
- Buildings
- spring[2]
- oc010---protocol
- 阅读《C陷阱与缺陷》的知识增量
- c++ 实现数据库连接池
- 应用启动选择
- EasyUI获取DataGrid中某一列的所有值
- EasyUI获取DataGrid中某一列的所有值
- Heartbeat
- EasyUI获取DataGrid中某一列的所有值
- 多校第一场 1003
- Linux kernel 分析之十九:阅读源代码技巧-变量命名规则
- hdu 5308 I Wanna Become A 24-Point Master 2015 Multi-University Training Contest 2