Search
Object 对象
Last updated
Unknown
键值对 property:value
# Key Point
- 和Array最大的差别在于,Object中属性顺序不重要,Array的顺序非常重要,因为它是我们访问元素的方式
 
# 用法
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  | var xiaoming = {
    name: '小明',
    birth: 1990,
    school: 'No.1 Middle School',
    height: 1.70,
    weight: 65,
    score: null
};
xiaoming.name; // '小明'
xiaoming.birth; // 1990
  | 
# 特殊命名
访问属性是通过.操作符完成的,但这要求属性名必须是一个有效的变量名。如果属性名包含特殊字符,就必须用''括起来:
1
2
3
4
  | var xiaohong = {
    name: '小红',
    'middle-school': 'No.1 Middle School'
};
  | 
xiaohong的属性名middle-school不是一个有效的变量,就需要用''括起来。访问这个属性也无法使用.操作符,必须用['xxx']来访问:
1
2
3
  | xiaohong['middle-school']; // 'No.1 Middle School'
xiaohong['name']; // '小红'
xiaohong.name; // '小红'
  | 
由于JavaScript的对象是动态类型,你可以自由地给一个对象添加或删除属性:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
  | var xiaoming = {
    name: '小明'
};
xiaoming.age; // undefined
xiaoming.age = 18; // 新增一个age属性
xiaoming.age; // 18
delete xiaoming.age; // 删除age属性
xiaoming.age; // undefined
delete xiaoming['name']; // 删除name属性
xiaoming.name; // undefined
delete xiaoming.school; // 删除一个不存在的school属性也不会报错
  | 
如果我们要检测xiaoming是否拥有某一属性,可以用in操作符:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
  | var xiaoming = {
    name: '小明',
    birth: 1990,
    school: 'No.1 Middle School',
    height: 1.70,
    weight: 65,
    score: null
};
'name' in xiaoming; // true
'grade' in xiaoming; // false
  | 
不过要小心,如果in判断一个属性存在,这个属性不一定是xiaoming的,它可能是xiaoming继承得到的:
1
  | 'toString' in xiaoming; // true
  | 
因为toString定义在object对象中,而所有对象最终都会在原型链上指向object,所以xiaoming也拥有toString属性。
要判断一个属性是否是xiaoming自身拥有的,而不是继承得到的,可以用hasOwnProperty()方法:
1
2
3
4
5
  | var xiaoming = {
    name: '小明'
};
xiaoming.hasOwnProperty('name'); // true
xiaoming.hasOwnProperty('toString'); // false
  | 
# 构造函数
因为一次创建一个对昂,里面很多的属性和方法是大量相同的,因此可以利用函数的方法重复相同的代码,我们把这个函数成为构造函数。因为这个代码不一样,里面封装的不是普通的代码,而是对象。构造函数就是把对象里面一些相同的属性和方法抽象出来封装到函数中。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  | function 构造函数名() {
	this.属性 = 值;
	this.方法 = function() {}
}
new 构造函数名();
// e.g
function Idol(yourname, yourage, yourgender) {
	this.name = 'yourname';
	this.age = age;
	this.gender = yourgender;
}
var star = new Idol('leslie', 28, 'male')
console.log(star.name) // 'leslie'
  | 
- 构造函数首字母大写。
 - 构造函数不需要
return就可以返回结果。 - 调用构造函数必须使用
new。 - 调用一次
new Idol就创造了一次对象。 
# new关键字执行过程
new构建函数在内存中创建了一个空的对象。this就会只想刚才创建的空对象。- 执行构造函数里面的代码,给这个空对象添加属性和方法。
 - 返回这个对象,因此不需要
return。 
# 遍历对象属性
for...in用于对数组或者对象的属性进行循环操作。
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
  | var obj = {
	name: 'x',
	age: 18,
	gender: 'male',
	fn: function() {}
}
// for (变量 in 对象) {
//}
for (var k in obj) {
	console.log(k) // k输出得到的是属性名
	console.log(obj[k]) //obj[k]得到的是属性值
}
// 使用for in里面的变量,习惯写k或者key
  | 
# 环境对象
- 环境对象指的是函数内部特殊的变量
this,它代表着当前函数运行时所处的环境。 - 函数的调用方式不同,
this指代的对象也不同。 - 谁调用,
this就是谁。