开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第4天,点击查看活动详情
第3章 对象
-
js中的对象是可变的键控集合。除简单数据类型以外的值都是对象。数组、函数、正则表达式皆为对象。
-
对象是属性的容器,属性拥有名字和值,属性名可是任意字符串,属性名可是除undefined以外的任何值
对象字面量
创建新对象值的表示法:
一个对象字面量-在一对花括号中的0或多个“名/值”对。
对象字面量可出现在任何允许表达式出现的地方。
var empty_object = {};
var stooge = {
"first-name": "Jason",
"last-name": "Howard"
};
对象是可嵌套的,属性值可从另一个对象字面量在内的任意表达式中获得,属性名不强制引号
var people = {
name: "Jason",
age: 12,
hasDog:{
name: "bob",
age: 1
}
}
检索
- 如要检索对象里包含的值,可用[] 和 . 表示
stooge["first-name"] // "Jason"
people.hasDog.name. // "bob"
- 如若检索不存在的成员属性,将返回undefined
stooge["middle-name"] // undefined
people.status // undefined
- || 运算符可用于填充默认值
var middle = stooge["middle-name"] || "none";
var status = people.status || "unknown";
- 从undefined的成员属性中取值会导致TypeError异常,可用&&避免错误
people.job // undefined
people.job.type // throw"TypeError"
people.job && people.job.type //undefined
更新
- 对象里的值可通过赋值语句来更新。
- 如属性名存在于对象里,属性值会被替换
stooge['first-name'] = 'July'
- 如属性名不存在,该属性便新增到对象中
stooge['middle-name'] = 'Lester'
people.job = {
type: '996'
}
引用
- 对象通过引用来传递
var x = stooge;
x.nickname = 'Curly';
var nick = stooge.nickname; // 因 x 和 stooge 指向同一对象的引用,so nick为'Curly'
var a = {}, b = {}, c = {}; // a、b和c 都引用不同的空对象
a=b=c={}; // a、b和c 都引用同一个空对象
原型
- 每个对象都可连接到一个原型对象,并继承属性
- 所有通过对象字面量创建的对象都连接到 object.prototype
object.create 方法创建一个使用原对象作其原型的新对象
if(typeof Object.beget !== 'function'){
Object.create = function(o){
var F = function(){};
F.prototype = o;
return new F();
}
}
var another_stooge = Object.create(stooge);
原型链:去获取对象的某个属性值,但没有此属性名,js会从原型对象中获取属性值,如原型对象也没有,便再从它的原型中寻找,依此类推,直到终点Object.prototype。
- 原型关系是动态关系,如添加一新属性到原型中,基于原型创建的对象皆可见该属性
反射
- 如检查对象有什么属性,去检索该属性并验证取得的值
- typeof 确定属性类型
- hasOwnProperty
枚举
- for in 语句可遍历一个对象中的所有属性,该枚举过程会列出所有的属性(包括原型中的属性,so可过滤掉不需要的值) 常用过滤器hasOwnProperty
var name;
for(name in another_stooge){
if(typeof another_stooge[name] !== 'function'){
document.writeIn(name + ": " + another_stooge[name])
}
}
删除
- delete 运算符可用来删除对象的属性
- 如对象包含此属性,那么该属性会被移除,不会触及原型链
another_stooge.nickname // 'jason'
// 删除 another 的 name 属性,从而暴露出原型的nickname 属性
delete another_stooge.nickname;
another_stooge.nickname // 'Curly'
减少全局变量污染
- 最小化使用全局变量-只创建一个唯一的全局变量
- 把全局性资源纳入一个名称空间之下
var myAPP = {}
myApp.stooge = {
name: 'Jason',
......
}