1.什么是方法定义并调用一个正则函数:functiongreet(who){return`Hello,${who}!`;}greet('World');//=>'你好世界!'function关键字后跟其名称、参数和主体:functiongreet(who){...}用于常规函数定义。greet('World')是一个常规函数调用。函数greet('World')接受参数中的数据。如果谁是一个对象的属性呢?为了方便访问对象的属性,我们可以为该对象附加一个函数,换句话说,创建一个方法。我们使用greet()作为对象世界的方法:constworld={who:'World',greet(){return`Hello,${this.who}!`;}}world.greet();//=>'你好,世界!greet(){...}现在是属于world对象的方法,world.greet()是方法调用。在greet()方法内部,this指向该方法所属的对象——world,这就是为什么this.who可以访问word属性的原因。请注意,这也称为上下文。上下文是可选的在前面的例子中,我们使用this来访问方法所属的对象,但是JS并不强制方法使用this。因此,一个对象可以作为一个方法的命名空间:constnamespace={greet(who){return`Hello,${who}!`;},farewell(who){return`Goodbye,${who}!`;}}namespace.greet('World');//=>'Hello,World!'namespace.farewell('World');//=>'Goodbye,World!'namespace是一个包含2个方法的对象:namespace.greet()和namespace.farewell()。2.对象字面量方法如上所述,我们可以直接在对象字面量中定义方法constworld={who:'World',greet(){return`Hello,${this.who}!`;}};world.greet();//=>'你好,世界!'greet(){....}是定义在对象中的方法,这种定义称为简写方法定义(自ES2015起可用)。方法定义语法也更长:constworld={who:'World',greet:function(){return`Hello,${this.who}!`;}}world.greet();//=>'Hello,World!'greet:function(){...}是一个方法定义,注意额外的冒号和function关键字。动态添加方法方法只是一个存储为对象属性的函数。因此,我们可以为对象动态添加方法:constworld={who:'World',greet(){return`Hello,${this.who}!`;}};//Aanewpropertyholdingfunctionworld.farewell=function(){return`再见,${this.who}!`;}world.farewell();//=>'再见,世界!'3.类方法在JavaScript中,类语法定义了一个类,该类将作为其实例的模板。类也可以有方法:classGreeter{constructor(who){this.who=who;}greet(){console.log(this===myGreeter);//logstruereturn`Hello,${this.who}!`;}}constmyGreeter=newGreeter('World');myGreeter.greet();//=>'你好,世界!'greet(){...}是类内部定义的方法。每次我们使用new运算符(例如myGreeter=newGreeter('World'))创建一个类的实例时,我们都可以在创建的实例上调用方法。myGreeter.greet()是在实例上调用方法greet()的方式。重要的是方法内部的this等于实例本身:this等于greet(){...}方法内部的myGreeter。4.如何调用方法4.1方法调用JavaScript特别有趣的是,在对象或类上定义方法只是成功了一半。为了维护方法的上下文,我们必须确保该方法作为方法被调用。让我们看看为什么它很重要。回想一下world对象有一个greet()方法。让我们测试当greet()作为方法和常规函数被调用时this的值是什么:constworld={who:'World',greet(){console.log(this===world);return`Hello,${this.who}!`;}};//方法调用world.greet();//logstrueconstgreetFunc=world.greet;//常规函数调用greetFunc();//=>logsfalseworld.greet()是一种方法转移。对象世界,后跟一个点,最后是进行方法调用的方法本身。greetFunc与world.greet是同一个函数。但是当作为常规函数调用greetFunc()时,greet()中的this不等于world对象,而是全局对象(浏览器中的window)我们将表达式命名为greetFunc=world.greet解耦一个方法的方法它的对象。在调用分离方法greetFunc()时,this等于全局对象。将方法与其对象分离可以采用不同的形式//方法分离,这是迷路了!constmyMethodFunc=myObject.myMethod;//方法分离,这个丢了!setTimeout(myObject.myMethod,1000);//方法分离,thisLost!myButton.addEventListener('click',myObject.myMethod)//方法分离,这个丢了!
