方法:
在对象中绑定函数,称为这个对象的方法。
定义方法:
//方式1
function getAge(){
var y = new Date().getFullYear();
return y-this.birth;
}
var cjs = {
name:'张三',
birth:1996,
age:getAge
};
console.log(cjs.age);//得到的是getAge()这个方法
console.log(cjs.getAge);//得到的是undefine,因为cjs没有getAge这个属性
console.log(age());//得到的是 21 是正确的,因为getAge赋值给了age,所以age也变成了一个函数。需要加上()才算调用
//方式2
var xiaoming={
name:'小明',
birth:1996,
age:function(){
var y=new Date().getFullYear();
return y-this.birth;
}
};
console.log(xiaoming.age);//获得的是这个匿名函数
console.log(xiaoming.age());//22,是方法执行后的值
注意了:
var fn = xiaozhang.age;//先拿到xiaozhang的age函数
fn();//NaN
要保证this指向正确,必须是obj.xxx();的形式。
注意:
当方法中还包含了一个方法时,如果里面的方法用到了this,那么会出错。因为在方法内定义的方法用this,这个this在‘strict’模式下会指向undefined,而在非‘strict’模式下,会指向window对象
示例代码:
var xiaohong={
name:'小红',
birth:2000,
age:function(){
function getAgeFromBirth(){
var y=new Date().getFullYear();
return y-this.birth;
}
return getAgeFromBirth();
}
};
console.log(xiaohong.age());//报错,显示birth这个属性未定义。因为此时的birth前面的this指向的不是xiaohong。
怎样解决这个问题呢?
方法1:在最外层的方法中定义一个变量that,让that = this.以后再出现用this的地方就用that代替。
方法1原理:因为最外层的方法的this是指向调用者对象的,将that = this,that就始终指向调用者对象。不会指向window或者undefined。
实现代码:
var xiaozhang={
name:'小张',
birth:2006,
age:function(){
var that=this;
function getAgeFromBirth(){
var y=new Date().getFullYear();
return y-that.birth;
}
return getAgeFromBirth();
}
};
console.log(xiaozhang.age());//21正确
方法2:直接用箭头函数来进行定义方法。
方法2原理:ES6新出的箭头函数,能够让this始终指向调用者。
示例代码:
var xiaozhang = {
birth:2006,
age: function () {
var b = this.birth;//2006
var func = ()=>{
return new Date().getFullYear()-this.birth;
}
return func();
}
};
console.log(xiaozhang.age()); //得到11,2017-2006
总结:
1.对象中的方法,调用时需要加上()才能得到结果。
2.当调用存在this的函数时,为了让this指向正确,必须用obj.xxx()的方式。
var fn = xiaozhang.age;//先拿到xiaozhang的age函数
fn();//NaN
这样是不行的
3.当出现方法中嵌套方法,并用到了this时,可以用一个变量代替this,也可以用箭头函数。