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