av激情亚洲男人的天堂国语,日韩欧美精品一中文字幕,无码av一区二区三区无码,国产又色又爽又刺激的a片,国产又色又爽又刺激的a片

JavaScript中的方法是什么

1.什么是方法

定義并調(diào)用一個(gè)常規(guī)函數(shù):

成都創(chuàng)新互聯(lián)公司成都網(wǎng)站建設(shè)定制開發(fā),是成都網(wǎng)站營銷推廣公司,為水電改造提供網(wǎng)站建設(shè)服務(wù),有成熟的網(wǎng)站定制合作流程,提供網(wǎng)站定制設(shè)計(jì)服務(wù):原型圖制作、網(wǎng)站創(chuàng)意設(shè)計(jì)、前端HTML5制作、后臺(tái)程序開發(fā)等。成都網(wǎng)站設(shè)計(jì)熱線:18982081108

 
 
 
 
  1. function greet(who) { 
  2.   return `Hello, ${who}!`; 
  3.  
  4. greet('World'); // => 'Hello, World!' 

function關(guān)鍵字后跟其名稱,參數(shù)和主體:function greet(who){...}進(jìn)行常規(guī)的函數(shù)定義。

greet('World')是常規(guī)的函數(shù)調(diào)用。函數(shù)greet('World')接受參數(shù)中的數(shù)據(jù)。

如果who是一個(gè)對(duì)象的屬性呢?要方便訪問對(duì)象的屬性,我們可以將函數(shù)附加到該對(duì)象,換句話說,就是創(chuàng)建一個(gè)方法。

我們將greet()作為對(duì)象world的一種方法:

 
 
 
 
  1. const world = { 
  2.   who: 'World', 
  3.  
  4.  greet() { return `Hello, ${this.who}!`; }} 
  5.  
  6. world.greet(); // => 'Hello, World!' 

greet() { ... }現(xiàn)在是屬于world對(duì)象的方法, world.greet()是方法調(diào)用。

在greet()方法內(nèi)部,this指向該方法所屬的對(duì)象—world,這就是為啥可以this.who訪問 word屬性的原因。

注意,this也稱為上下文。

上下文是可選的

在上一個(gè)示例中,我們使用this來訪問該方法所屬的對(duì)象,但是 JS 沒有強(qiáng)制讓方法使用 this。

因此,可以將對(duì)象用作方法的命名空間:

 
 
 
 
  1. const namespace = { 
  2.   greet(who) { 
  3.     return `Hello, ${who}!`; 
  4.   }, 
  5.  
  6.   farewell(who) { 
  7.     return `Good bye, ${who}!`; 
  8.   } 
  9.  
  10. namespace.greet('World');    // => 'Hello, World!' 
  11. namespace.farewell('World'); // => 'Good bye, World!' 

namespace是一個(gè)包含2個(gè)方法的對(duì)象:namespace.greet()和namespace.farewell()。

2. 對(duì)象字面量方法

如前所述,我們可以直接在對(duì)象字面量中定義方法

 
 
 
 
  1. const world = { 
  2.   who: 'World', 
  3.  
  4.  greet() { return `Hello, ${this.who}!`; }}; 
  5.  
  6. world.greet(); // => 'Hello, World!' 

greet() { .... }是在對(duì)象定義的方法,這種定義類型稱為速記方法定義(從ES2015開始可用)。方法定義的語法也更長:

 
 
 
 
  1. const world = { 
  2.   who: 'World', 
  3.   greet: function() {  
  4.     return `Hello, ${this.who}!`;  
  5.   } 
  6.  
  7. world.greet(); // => 'Hello, World!' 

greet: function() { ... }是一個(gè)方法定義,注意附加的冒號(hào)和function關(guān)鍵字。

動(dòng)態(tài)添加方法

方法只是一個(gè)函數(shù),它作為屬性存儲(chǔ)在對(duì)象上。因此,我們可以向?qū)ο髣?dòng)態(tài)添加方法:

 
 
 
 
  1. const world = { 
  2.   who: 'World', 
  3.  
  4.   greet() { 
  5.     return `Hello, ${this.who}!`; 
  6.   } 
  7. }; 
  8.  
  9. // A a new property holding a function 
  10. world.farewell = function () { 
  11.   return `Good bye, ${this.who}!`; 
  12.  
  13. world.farewell(); // => 'Good bye, World!' 

3.類方法

在 JavaScript 中,類別語法定義了一個(gè)類別,該類別將用作其實(shí)例的模板。

類也可以有方法:

 
 
 
 
  1. class Greeter { 
  2.   constructor(who) { 
  3.     this.who = who; 
  4.   } 
  5.  
  6.  greet() { console.log(this === myGreeter); // logs true return `Hello, ${this.who}!`; }} 
  7.  
  8. const myGreeter = new Greeter('World'); 
  9. myGreeter.greet(); // => 'Hello, World!'  

greet() { ... }是在類內(nèi)部定義的方法。

每次我們使用new操作符(例如myGreeter = new Greeter('World'))創(chuàng)建一個(gè)類的實(shí)例時(shí),都可以在創(chuàng)建的實(shí)例上調(diào)用方法。

myGreeter.greet()是如何在實(shí)例上調(diào)用方法greet()的方法。重要的是方法內(nèi)部的this等于實(shí)例本身:this等于greet() { ... }方法內(nèi)部的 myGreeter。

4.如何調(diào)用方法

4.1方法調(diào)用

JavaScript 特別有趣的是,在對(duì)象或類上定義方法只能算完成工作的一半。為了維護(hù)方法的上下文,我們必須確保將方法作為方法調(diào)用。

我們來看看為什么它很重要。

回憶一下有g(shù)reet()方法的world對(duì)象。我們測試一下greet()作為一個(gè)方法和一個(gè)常規(guī)函數(shù)調(diào)用時(shí),this值是什么:

 
 
 
 
  1. const world = { 
  2.   who: 'World', 
  3.  
  4.   greet() { 
  5.  console.log(this === world);    return `Hello, ${this.who}!`; 
  6.   } 
  7. }; 
  8.  
  9. // 方法調(diào)用 
  10. world.greet(); // logs true 
  11. const greetFunc = world.greet; 
  12. // 常規(guī)函數(shù)調(diào)用 
  13. greetFunc(); // => logs false 

world.greet()是一個(gè)方法調(diào)用。對(duì)象world,后面是一個(gè)點(diǎn).,最后是使方法調(diào)用的方法本身。

greetFunc與world.greet是同一個(gè)函數(shù)。但當(dāng)作為常規(guī)函數(shù)greetFunc()調(diào)用時(shí),這個(gè)在greet()中的并不等于world對(duì)象,而是全局對(duì)象(在瀏覽器中是window)

我們將諸如greetFunc = world.greet之類的表達(dá)式命名為將方法與其對(duì)象分離的方法。調(diào)用分離的方法greetFunc()時(shí),this等于全局對(duì)象。

將方法與其對(duì)象分離可以采用不同的形式:

 
 
 
 
  1. // 方法分離, this 丟失了! 
  2. const myMethodFunc = myObject.myMethod; 
  3.  
  4. // 方法分離, this 丟失了! 
  5. setTimeout(myObject.myMethod, 1000); 
  6.  
  7. // 方法分離, this 丟失了! 
  8. myButton.addEventListener('click', myObject.myMethod) 
  9.  
  10. // 方法分離, this 丟失了! 
  11. My React Button 

為了避免丟失方法的上下文,請(qǐng)確保使用方法調(diào)用world.greet()或手動(dòng)將方法綁定到對(duì)象greetFunc = world.greet.bind(this)。

4.2間接函數(shù)調(diào)用

如上一節(jié)所述,常規(guī)函數(shù)調(diào)用已將this解析為全局對(duì)象。常規(guī)函數(shù)是否可以通過方法自定義 this值?

歡迎使用以下間接函數(shù)調(diào)用:

myFunc.call(thisArg, arg1, arg2, ..., argN);

myFunc.apply(thisArg, [arg1, arg2, ..., argN]);

函數(shù)對(duì)象上可用的方法。

myFunc.call(thisArg) 和 myFunc.apply(thisArg) 的第一個(gè)參數(shù)是間接調(diào)用的上下文(this值)。換句話說,我們可以手動(dòng)指定函數(shù)內(nèi)部 this 的值。

例如,讓我們將greet()定義為一個(gè)常規(guī)函數(shù),以及一個(gè)具有who屬性的對(duì)象alien:

 
 
 
 
  1. function greet() { 
  2.   return `Hello, ${this.who}!`; 
  3.  
  4. const aliens = { 
  5.   who: 'Aliens' 
  6. }; 
  7.  
  8. greet.call(aliens); // => 'Hello, Aliens!' 
  9. greet.apply(aliens); // => 'Hello, Aliens!' 

greet.call(aliens)和greet.apply(aliens)都是間接的方法調(diào)用。這個(gè)在greet()函數(shù)中的值等于aliens對(duì)象。

4.3 綁定函數(shù)調(diào)用

最后,還有一種在對(duì)象上使函數(shù)作為方法調(diào)用的第三種方法。我們可以將函數(shù)綁定為具有特定上下文。

可以使用特殊方法創(chuàng)建綁定函數(shù)

 
 
 
 
  1. const myBoundFunc = myFunc.bind(thisArg, arg1, arg2, ..., argN); 

myFunc.bind(thisArg)的第一個(gè)參數(shù)是函數(shù)要綁定到的上下文。

例如,讓我們重用greet()并將其綁定到aliens上下文

 
 
 
 
  1. function greet() { 
  2.   return `Hello, ${this.who}!`; 
  3.  
  4. const aliens = { 
  5.   who: 'Aliens' 
  6. }; 
  7.  
  8. const greetAliens = greet.bind(aliens); 
  9.  
  10. greetAliens(); // => 'Hello, Aliens!' 

調(diào)用 greet.bind(aliens) 會(huì)創(chuàng)建一個(gè)新函數(shù),該函數(shù)將 this 綁定到aliens對(duì)象。

同樣,使用綁定函數(shù)可以模擬方法調(diào)用。當(dāng)調(diào)用綁定函數(shù)greetAliens()時(shí),this等于該函數(shù)中的 aliens。

5. 箭頭函數(shù)作為方法

不推薦使用箭頭函數(shù)作為方法,原因如下。

我們將greet()方法定義為一個(gè)箭頭函數(shù):

 
 
 
 
  1. const world = { 
  2.   who: 'World', 
  3.  
  4.   greet: () => { 
  5.     return `Hello, ${this.who}!`; 
  6.   } 
  7. }; 
  8.  
  9. world.greet(); // => 'Hello, undefined!' 

不幸的是,world.greet()返回'Hello, undefined!而不是我們期待的'Hello, World!'。

問題是箭頭函數(shù)內(nèi)部的this等于外部作用域的this。但是,此時(shí),我們想要的this是world對(duì)象。

上述箭頭功能內(nèi)部 this 等于全局對(duì)象:window。'Hello, ${this.who}!' 結(jié)果是 Hello, ${windows.who}!,最后是 'Hello, undefined!'。

我喜歡箭頭功能, 但是它們不能用作方法。

6. 總結(jié)

該方法是一個(gè)屬于對(duì)象的函數(shù)。方法的上下文(this)等于該方法所屬的對(duì)象。

還可以在類上定義方法。這個(gè)類的方法內(nèi)部等于實(shí)例。JS 特有的一點(diǎn)是,僅僅定義一個(gè)方法是不夠的。我們還需要確保使用方法調(diào)用。通常,方法調(diào)用具有以下語法

 
 
 
 
  1. // Method invocation 
  2. myObject.myMethod('Arg 1', 'Arg 2'); 

有趣的是,在 JS 中,我們可以定義一個(gè)常規(guī)函數(shù),但不屬于一個(gè)對(duì)象,然后作為一個(gè)任意對(duì)象的方法調(diào)用該函數(shù)??梢允褂瞄g接函數(shù)調(diào)用或?qū)⒑瘮?shù)綁定到特定上下文來實(shí)現(xiàn)這一點(diǎn)

 
 
 
 
  1. // Indirect function invocation 
  2. myRegularFunc.call(myObject, 'Arg 1', 'Arg 2'); 
  3. myRegularFunc.apply(myObject, 'Arg 1', 'Arg 2'); 
  4.  
  5. // Bound function 
  6. const myBoundFunc = myRegularFunc.bind(myObject); 
  7. myBoundFunc('Arg 1', 'Arg 2'); 

我是小智,我要去刷碗了,我們下期見~

作者:Shadeed 譯者:前端小智 來源:dmitripavlutin 原文:https://dmitripavlutin.com/javascript-method/

本文轉(zhuǎn)載自微信公眾號(hào)「大遷世界」,可以通過以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系大遷世界公眾號(hào)。


標(biāo)題名稱:JavaScript中的方法是什么
標(biāo)題網(wǎng)址:http://uogjgqi.cn/article/djgiihi.html
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問/技術(shù)咨詢/運(yùn)營咨詢/技術(shù)建議/互聯(lián)網(wǎng)交流