对象
JavaScript的简单数据类型包括数字,字符串,布尔值,null和undefined。其它所有的值都是对象。
数字,字符串,布尔值貌似对象,因为它们有方法,但是它们是不可变的。
对象字面量
var obj={
"first-name":"Mike"
}
// var obj1={
// first-name:"Mike"
// } //error
console.log(obj["first-name"]); //Mike
// console.log(obj[first-name])//error
var obj={
["first-name"]:"Mike"
// [first-name]:"Nike" //error
}
探索发现:
- 在对象字面量中,如果属性名是一个合法的javascript的标识符,且不是保留字,则不强制要求用引号来括住属性名。
- JavaScript的标识符包含连接符(-)是不合法的,但是使用下划线(_)是合法的。
检索
要检索对象里包含的值,可以采用在[]后缀中括住一个字符串表达式的方式。
如果一个字符串表达式是一个字符串字面量,而且它是一个合法的javascript标识符且不是保留字,那么也可以使用 . 表示法代替。我们一般优先考虑 . 表示法,因为它的可读性更好。
var flight={
arrival:{
time:"2001-01-23"
}
}
console.log(flight.equipment); //undefined
// console.log(flight.equipment.name); //error
console.log(flight.equipment&&flight.equipment.name); //undefined
探索发现:
- 我们如果从undefined的成员属性中取值,则会导致错误。
- 我们通过&&运算符来避免错误。
- 为什么可以使用上面的方法来规避错误?要从&&规则说起,
我们看 a>5&&a<10 这样一段,计算机为了节省运算,会一段一段来解析,只有当返回值为true时,才会继续解析。如果a>5为false,则不会再继续元素运算而是停止,并且返回false,这下,可以理解为什么undefined&&error返回undefined了吧!
引用
对象是通过引用来传递,它永远不会被复制
var x=obj;
x["first-name"]="Lili";
console.log(obj["first-name"]);//Lili
因为obj和x是指向同一个对象的引用。
删除
delete运算符可以用来删除对象的属性。如果该对象包含该属性,那么该属性就会被移除,它不会触及原型链中的任何对象。
obj.name="Lili";
Object.prototype.name="Mike";
delete obj.name;
console.log(obj.name);//Mike
删除obj.name可以让来自原型链的属性透露出来。
原型
每一个对象都连接到一个原型对象,并且它可以从中继承属性。
当你创建一个新对象的时候,你可以选择某个对象作为它的原型。我们给Object增加一个create方法,这个方法创建一个使用原对象作为其原型的新对象。
var obj1={
"name":"Mike",
"age":12,
"sex":"female"
}
if(typeof Object.beget!=='function'){
Object.create=function(o){
var F=function(){};
F.prototype=o;
return new F();
}
}
var obj2=Object.create(obj1);
obj2.name="Lili";
delete obj2.name;
console.log(obj2.name); //Mike
- 但我们对某个对象做出更新时,不会触及该对象的原型。
- 原型连接只有在检索的时候才被用到,如果我们尝试去获取对象的某个属性值,但是该对象没有属性名,那么javascript会试着从原型对象中获取属性值。如果原型对象中也没有,那么就从它的原型中找,一直到Object.prototype。如果还没有找到,那么结果就是undefined。这个过程称为委托。