国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

JavaScript中方法的作用是什么

發(fā)布時(shí)間:2021-07-06 14:08 來(lái)源:億速云 閱讀:0 作者:Leah 欄目: web開(kāi)發(fā)

這期內容當中小編將會(huì )給大家帶來(lái)有關(guān)JavaScript中方法的作用是什么,文章內容豐富且以專(zhuān)業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

1.什么是方法

定義并調用一個(gè)常規函數:

function greet(who) {   return `Hello, ${who}!`; }  greet('World'); // => 'Hello, World!'

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

greet('World')是常規的函數調用。函數greet('World')接受參數中的數據。

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

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

const world = {   who: 'World',   greet() { return `Hello, ${this.who}!`; }}  world.greet(); // => 'Hello, World!'

greet() { ... }現在是屬于world對象的方法, world.greet()是方法調用。

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

注意,this也稱(chēng)為上下文。

上下文是可選的

在上一個(gè)示例中,我們使用this來(lái)訪(fǎng)問(wèn)該方法所屬的對象,但是 JS 沒(méi)有強制讓方法使用 this。

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

const namespace = {   greet(who) {     return `Hello, ${who}!`;   },    farewell(who) {     return `Good bye, ${who}!`;   } }  namespace.greet('World');    // => 'Hello, World!' namespace.farewell('World'); // => 'Good bye, World!'

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

2. 對象字面量方法

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

const world = {   who: 'World',   greet() { return `Hello, ${this.who}!`; }};  world.greet(); // => 'Hello, World!'

greet() { .... }是在對象定義的方法,這種定義類(lèi)型稱(chēng)為速記方法定義(從ES2015開(kāi)始可用)。方法定義的語(yǔ)法也更長(cháng):

const world = {   who: 'World',   greet: function() {      return `Hello, ${this.who}!`;    } }  world.greet(); // => 'Hello, World!'

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

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

方法只是一個(gè)函數,它作為屬性存儲在對象上。因此,我們可以向對象動(dòng)態(tài)添加方法:

const world = {   who: 'World',    greet() {     return `Hello, ${this.who}!`;   } };  // A a new property holding a function world.farewell = function () {   return `Good bye, ${this.who}!`; }  world.farewell(); // => 'Good bye, World!'

3.類(lèi)方法

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

類(lèi)也可以有方法:

class Greeter {   constructor(who) {     this.who = who;   }   greet() { console.log(this === myGreeter); // logs true return `Hello, ${this.who}!`; }}  const myGreeter = new Greeter('World'); myGreeter.greet(); // => 'Hello, World!'

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

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

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

4.如何調用方法

4.1方法調用

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

我們來(lái)看看為什么它很重要。

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

const world = {   who: 'World',    greet() {  console.log(this === world);    return `Hello, ${this.who}!`;   } };  // 方法調用 world.greet(); // logs true const greetFunc = world.greet; // 常規函數調用 greetFunc(); // => logs false

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

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

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

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

// 方法分離, this 丟失了! const myMethodFunc = myObject.myMethod;  // 方法分離, this 丟失了! setTimeout(myObject.myMethod, 1000);  // 方法分離, this 丟失了! myButton.addEventListener('click', myObject.myMethod)  // 方法分離, this 丟失了! <button onClick={myObject.myMethod}>My React Button</button>

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

4.2間接函數調用

如上一節所述,常規函數調用已將this解析為全局對象。常規函數是否可以通過(guò)方法自定義 this值?

歡迎使用以下間接函數調用:

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

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

函數對象上可用的方法。

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

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

function greet() {   return `Hello, ${this.who}!`; }  const aliens = {   who: 'Aliens' };  greet.call(aliens); // => 'Hello, Aliens!' greet.apply(aliens); // => 'Hello, Aliens!'

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

4.3 綁定函數調用

最后,還有一種在對象上使函數作為方法調用的第三種方法。我們可以將函數綁定為具有特定上下文。

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

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

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

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

function greet() {   return `Hello, ${this.who}!`; }  const aliens = {   who: 'Aliens' };  const greetAliens = greet.bind(aliens);  greetAliens(); // => 'Hello, Aliens!'

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

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

5. 箭頭函數作為方法

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

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

const world = {   who: 'World',    greet: () => {     return `Hello, ${this.who}!`;   } };  world.greet(); // => 'Hello, undefined!'

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

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

上述箭頭功能內部 this 等于全局對象:window。'Hello, ${this.who}!' 結果是 Hello,  ${windows.who}!,最后是 'Hello, undefined!'。

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

6. 總結

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

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

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

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

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

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系站長(cháng)郵箱:ts@56dr.com進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。

非洲黑女人性恔视频LOOPOO| 久久精品亚洲综合专区| 美女露100%奶头的视频| 午夜射精日本三级| 无码中文字幕乱在线观看| WWW.AV天堂.COM|