方法:
在對象中綁定函數,稱爲這個對象的方法。
定義方法:
//方式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,也可以用箭頭函數。