方法


绑定到对象的函数就是方法。

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(),唯一区别是:

比如调用Math.max(3, 5, 4),分别用apply()和call()实现如下:

                    Math.max.apply(null, [3, 5, 4]); // 5
                    Math.max.call(null, 3, 5, 4); // 5
                

本节重点: