当前位置: 首页 > 科技观察

什么是JavaScript中的方法

时间:2023-03-14 09:14:28 科技观察

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)//方法分离,这个丢了!MyReactButton为避免丢失方法的上下文,请确保使用方法调用world.greet()或手动将方法绑定到对象greetFunc=world.greet.bind(这)。4.2间接函数调用如前一节所述,常规函数调用会将this解析为全局对象。常规函数是否可以通过方法自定义这个值?欢迎使用以下间接函数调用:myFunc.call(thisArg,arg1,arg2,...,argN);myFunc.apply(thisArg,[arg1,arg2,...,argN]);函数对象上可用的方法。myFunc.call(thisArg)和myFunc.apply(thisArg)的第一个参数是间接调用的上下文(this值)。也就是说,我们可以在函数内部手动指定this的值。例如,让我们将greet()定义为一个常规函数,以及一个具有who属性的对象alien:functiongreet(){return`Hello,${this.who}!`;}constaliens={who:'Aliens'};greet.call(aliens);//=>'你好,外星人!'greet.apply(aliens);//=>'Hello,Aliens!'greet.call(aliens)和greet.apply(aliens)都是间接方法调用。greet()函数中的这个值等于外星人对象。4.3绑定函数调用最后,还有第三种将函数调用作为对象方法的方法。我们可以绑定函数以具有特定的上下文。可以使用特殊方法constmyBoundFunc=myFunc.bind(thisArg,arg1,arg2,...,argN)创建绑定函数;myFunc.bind(thisArg)的第一个参数是函数绑定到的上下文。例如,让我们重用greet()并将其绑定到外星人上下文函数greet(){return`Hello,${this.who}!`;}constaliens={who:'Aliens'};constgreetAliens=greet.bind(外星人);greetAliens();//=>'你好,外星人!'调用greet.bind(aliens)创建一个将this绑定到aliens对象的新函数。同样,可以使用绑定函数模拟方法调用。在调用绑定函数greetAliens()时,this等于函数中的外星人。5.箭头函数作为方法不推荐使用箭头函数作为方法,原因如下。我们将greet()方法定义为箭头函数:constworld={who:'World',greet:()=>{return`Hello,${this.who}!`;}};world.greet();//=>'你好,未定义!'不幸的是,world.greet()返回“你好,未定义!”而不是“你好,世界!”我们期待。问题是箭头函数内部的this等于外部作用域中的this。然而,在这一点上,我们想要的是世界对象。在上面的箭头函数中,this等于全局对象:window。“你好,${this.who}!”结果是你好,${windows.who}!最后是“你好,未定义!”。我喜欢箭头函数,但它们不能用作方法。6.总结方法是属于对象的函数。方法的上下文(this)等于方法所属的对象。您还可以在类上定义方法。此类的方法在内部等于实例。JS的一个特点是仅仅定义一个方法是不够的。我们还需要确保使用方法调用。通常,方法调用具有以下语法//MethodinvocationmyObject.myMethod('Arg1','Arg2');有趣的是,在JS中,我们可以定义一个普通的函数,但不属于某个对象,然后作为任意对象的方法调用该函数。这可以使用间接函数调用或通过将函数绑定到特定上下文来实现//BoundfunctionconstmyBoundFunc=myRegularFunc.bind(myObject);myBoundFunc('Arg1','Arg2');我是小智,我去洗碗了,下次见~作者:Shadeed译者:前端小智来源:dmitripavlutin原创:https://dmitripavlutin.com/javascript-method/本文转载自微信公众号《伟大的走向世界》,可以通过以下二维码关注。转载本文请联系大千世界公众号。