十三、对象属性遍历、this、caller\callee
一、对象属性遍历
1.1 链式操作
问题:对象中有多个方法,想要在一个方法执行结束后,继续点语法调用下一个方法。
方式:在每个方法后面加上return this
。
解释:方法执行到最后一句,返回 this,而this指向对象,即返回对象;然后对象再用点语法调用方法,形成类似于链条的操作。
var sched = {
wakeup: function(){
console.log('Running');
return this;
},
morning: function(){
console.log('Go shopping');
return this;
},
noon: function(){
console.log('play basketball');
return this;
}
}
sched.wakeup().morning().noon();
1.2 对象调用属性的两种方式
1.2.1 点语法
var obj = {
name: 'white'
}
console.log(obj.name); //'white'
1.2.2 [‘属性名’]
var myLang = {
No1: 'HTML',
No2: 'CSS',
No3: 'JavaScript',
myStudyLang: function(num){
console.log(this['No' + num])
}
}
myLang.myStudyLang(3); //'JavaScript'
最早js引擎对对象的处理:obj[‘属性名’]。
有了点语法以后,js引擎把obj.属性名 隐式转换->obj[‘属性名’]再处理。
总结:当对象访问属性时,js引擎处理方式最终都会变成obj[‘属性名’]的形式
1.3 对象枚举
js中的枚举说的是对象枚举。
js中说枚举->遍历,遍历:在一种信息内一个一个获得其信息的过程。
1.3.1 数组枚举
js中数组是特殊的对象,使用for循环遍历。
1.3.2 对象枚举
使用for in循环遍历
var car = {
brand: 'benz',
color: 'red',
displacement: '3.0'
}
for(var i in car){
console.log(i + ':' + car[i]);
}
console.log('-----------')
for(var key in car){
console.log(key + ':' + car.key);
}
为什么在for in循环中使用对象.属性名
获取的数据是undefined?
因为car中没有一个具体的属性叫key;
总结使用场景:
-
.语法:当我们想要获取对象某个确定的属性时,会使用点语法+属性名的形式调用对象的属性。
-
[]语法:当我们不确定对象的属性名,或者想要获取对象的所有属性时,可以用[key]的形式,这里的key是一个变量,代表可变的字符串,用这个可变的字符串去对象中寻找对应的属性。
js引擎的处理过程:
1.car.key ->这里的key是对象的具体属性key -> car[‘key’] 而对象中没有一个属性名为字符串’key’->得到undefined,字符串’key’是定值
2.car[key]->这里的key是全局声明的key,key值随着遍历在改变
var car = {
brand: 'benz',
color: 'red',
displacement: '3.0',
key: '字符串key'
}
for(var i in car){
console.log(i + ':' + car[i]);
}
console.log('-----------')
for(var key in car){
console.log(key + ':' + car.key);
}
for in 能遍历数组吗? √
var arr = [1, 2, 3, 4, 5]
for(key in arr){
console.