JavaScript中的方法

方法:

在對象中綁定函數,稱爲這個對象的方法。

定義方法:

//方式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,也可以用箭頭函數。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章