首页 > javascript > 《javascript精粹》读书笔记 – 对象

《javascript精粹》读书笔记 – 对象

2011年1月9日

《javascript精粹》中和对象相关的内容:

1. 当尝试检索对象的一个并不存在的成员元素的值,将返回一个undefined值。可以通过“||”运算符来填充默认值:
[js]
stooge["middle-name"] //undefined
var middle = stooge["middle-name"] || "tom";
[/js]

2. 当尝试检索一个undefined值将会导致TypeError异常。可以通过“&&”运算符来避免错误:
[js]
flight.equipment //undefined
flight.equipment.model //throw "TypeError"
flight.equipment && flight.equipment.model //undefined
[/js]

3. 对象通过引用来传递。他们永远不会被拷贝
[js]
var x = stooge;
x.nickname = ‘Curly’;
var nick = stooge.nickname;
//因为x和stooge是指向同一个对象的引用,所以nick的值为’Curly’

var a={}, b={}, c={};
//a, b和c每个都引用一个<strong>不同</strong>的空对象

a=b=c={}
//a,b和c都引用<strong>同一个</strong>空对象
[/js]

4. 原型连接
通过beget方法创建一个使用原对象作为其原型的新对象
[js]
if (typeof Object.beget !== ‘function’)
{
Object.beget = function (o)
{
var F = function () {};
F.prototype = o;
return new F();
}
}

var another_stooge = Object.beget(stooge);
[/js]
注:
a. 原型连接在更新时是不起作用的
当我们对某个对象作出改变时,不会触及到该对象的原型。
b. 原型连接只有在检索值的时候才被用到
如果尝试去获取对象的某个属性值,且该对象没有此属性名,那么从它的圆形对象中获取属性值。 (如果那个原型对象也没有该属性值,那么再从它的原型中寻找,依次类推,知道该过程左后的重点Object.prototype。如果想要的属性完全不存在于原型链中,那么结果就是undefined值。这个过程称为委托
c. 原型关系是一种动态关系。
如果我们添加一个新的属性到原型中,该属性会立即对所有基于该原形创建的对象可见。

5. 反射
在一些时候下,我们需要能够在对对象完全不了解的情况下进行处理,并且在处理之前发现他们的属性和方法,这个过程称作反射(reflection)。
在判断对象是否有某一属性时,可以使用”hasOwnProperty“方法,如果对象拥有独有的属性,它将返回true。
注:hasOwnProperty方法不会检查原型链。

6. 枚举
for in 语句可以用来遍历一个对象中的所有属性名。
属性名出现的顺序是不确定的,因此要对任何可能出现的顺序有所准备。如果你想要确保属性以特定的顺序出现,最好的办法就是完全避免使用for in语句,而是创建一个数组,在其中以正确的顺序包含属性名:
[js]
//使用for in语句:
var name;
for (name in another_stooge)
{
if(typeof another_stooge[name] !== ‘function’)
{
document.writeln(name + ‘: ‘ + another_stooge[name]);
}
}

//使用for语句
var i;
var properties = [
'first-name',
'middle-name',
'last-name',
'profession'
]
for (i=0; i<properties.length; i +=1)
{
document.writeln(properties[i] + ‘: ‘ +
another_stooge[properties[i]]);
}
[/js]

本文的评论功能被关闭了.