您的位置:首页 > 其它

犀牛——第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.property

object["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;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: