方法
绑定到对象的函数就是方法。
this
在对象的方法中,我们常常使用this关键字。this关键字代表方法所绑定的对象。
var wangqiang = { name : "wangqiang", age : 18, city : "guangzhou", address : "tianhe", //绑定到对象的函数叫方法 getBirth:function(){ let now = new Date(); return now.getFullYear() - this.age; } } wangqiang.getBirth(); //2005 var birth = wangqiang.getBirth; birth(); //NaN,脱离了绑定的对象。
上述代码所示,在方法getBirth()内部,我们用到了一个this关键字。这个关键字指向了绑定的对象,要正确执行方法,需要按照 obj.xxx()的方式才能正确地调用方法,保证方法绑定的对象,this的指向才能正确。
再看如下代码:
var lili = { name : "lili", age : 12, city : "beijing", address : "chaoyang", getBirth : function(){ let diff = function(year){ //超出了this的作用范围,this为undefined return year-this.age; } let now = new Date(); console.log(diff(2022)); return now.getFullYear() - this.age; } }
在getBirth方法中,我们有定义了一个匿名函数。在匿名函数不能再使用this,因为这时的this是undefined。我们可以在匿名函数外部用一个 变量接收this,在匿名函数内部再使用这个变量。也就是this对象不能跨越两层函数进行使用。
var lili = { name : "lili", age : 12, city : "beijing", address : "chaoyang", //方法的简写 getBirth(){ let that = this; let diff = function(year){ return year-that.age; } let now = new Date(); console.log(diff(2022)); return now.getFullYear() - this.age; } }
为此,可以在第一次函数里用一个变量that接收this,在第二层函数里再使用that,从而避免this变量不能跨越两层的障碍。
apply
函数通过apply方法,应用到对象上。
var xiaoli = { name : "xiaoli", age : 12, city : "beijing", address : "chaoyang", birth : getBirth } function getBirth(){ let now = new Date(); return now.getFullYear() - this.age; } xiaoli.birth(); getBirth.apply(xiaoli,[]);//应用到xiaoli对象上,参数数组为[] getBirth(); // Uncaught TypeError
另一个与apply()类似的方法是call(),唯一区别是:
- apply()把参数打包成Array再传入;
- call()把参数按顺序传入。
比如调用Math.max(3, 5, 4),分别用apply()和call()实现如下:
Math.max.apply(null, [3, 5, 4]); // 5 Math.max.call(null, 3, 5, 4); // 5
本节重点:
- 什么是方法,方法的调用;
- 注意对象方法内部的this指向,避免指向错误;
- apply,call的使用和区别。