玩轉方法 call和apply

2022-10-07 12:39:08 字數 2039 閱讀 7039

在ecmascript v3中,給function原型定義了這兩個方法,這兩個方法的作用都是一樣的:使用這兩個方法可以像呼叫其他物件方法一樣呼叫函式,這句話是從書上抄的,至少我是沒讀明白這是什麼意思。

下面說簡單易懂的,先看段**:

複製** **如下:

function introduce(name,age)

var p=new people();

introduce.call(p,"windking",20);

就說上面的這段**,用了call之後,introduce就成了p的方法,不知道這樣說你明白了麼?使用了call方法,上述的**就等同於了這個**:

複製** **如下:

function people(name,age)

; }

明白意思了麼?apply也是一樣的作用。

好,我們不管這個方法到底能在實際中用到什麼,先講語法。

call接受至少乙個引數,call的第乙個引數是指你所需要的物件,比如說上面的那個例子,introduce方法希望他能夠被物件p所呼叫,那麼就把p作為call的第乙個引數。剩餘的引數個數是任意的,作用是作為introduce方法的引數。順序按照introduce引數宣告的順序。比如introduce.call(p,"windking",20),假如introduce是p的乙個例項方法,那麼也就是這樣的:p.introduce("windking",20)。明白了麼?記住,傳入引數的順序要與函式宣告引數的順序保持一致。

了解了call,apply方法就容易理解了,apply和call唯一的區別是call接受至少乙個引數,而apply只接受兩個引數,第乙個引數與call一樣,第二個引數是乙個帶下標的集合,比如說introduce.call(p,"windking",20)就可以改寫成introduce.apply(p,www.cppcns.com[www.cppcns.com"windking",20])了。這次明白了麼?

那究竟這兩個方法有什麼用呢?如果我們只是為了實現上面的那個功能,把introduce實現為people的方法不是更好麼?程式設計客棧

我把應用總結為兩條:

1.共享方法。先看**:

複製** **如下:

function introduce(name,age)

這是乙個自我介紹的方法,現在假設我們有乙個男孩的類,和乙個女孩的類(在這裡我只是為了演示,在實際中,會用乙個people的父類),因為他們的introduce都是一樣的,於是我們就可以共享這個方法。

複製** **如下:

function boy()

; }

同理,girl中也是一樣,這樣的話,我們就可以避免寫**了。其實這個有些牽強,因為我們完全也可以寫成:

複製** **如下:

function boy() }

但是這個時候,我們如果用apply的話,就看上去簡單多了:

複製** **如下:

function boy()

; }

是不是簡單了很多呢?如果引數很多的話,那麼是不是不用再寫那麼一場串密密麻麻的引數了呢!

2.跨域呼叫

看乙個簡單的例子(僅為演示,無任何價值):

複製** **如下:

function boy(name,age) }

function girl(name,age)

這是乙個boy和乙個girl類,然後我們寫如下的**:

var b=new boy("windking",20);

b.boyintroduce();

這沒有任何異議。假設有一天有乙個女孩也希望做一下自我介紹,只是偶然用一下,那麼我就沒有必要修改girl類,因為其他的女孩比較害羞,不喜歡自我介紹。那麼這個時候我就可以這樣。

var g=new girl("xuan",22);

introduce.call(g,"xuan",22);

3.真正用處——繼承

好了,上面都是雕蟲小技,不登大雅之堂,下面才是call和apply最廣泛的應用,就是用於構造繼承。

本文標題: 玩轉方法:call和apply

本文位址:

apply 方法和call 方法

obj.func.call obj1 是將obj1看做obj,呼叫func方法,將第乙個引數看做函式呼叫的物件,可以看做,將obj的方法給obj1使用 在函式體內this的值就是指向這個呼叫者,也就是第乙個引數,剩餘的引數都是需要傳遞給函式的值 例如 function add a,b return ...

call() 和 apply()方法的區別

var foo window.value 2 function bar bar 2 bar.call foo 1 改變了函式裡面this額指向,原來指向的是wingdow,現在指向的是foo這個物件 function test str test jdaj jdaj var object new ob...

call和apply方法的異同

相信很多前端小夥伴們在寫 的時候應該都用過call 這兩個方法,應該也對這兩個方法有個基本的了解。但肯定也有些小夥伴對它們不是很熟悉,那這次就來 一下這兩個方法 想要深入了解call 這兩個方法,那麼必須要先知道他們的基本作用 改變物件的執行上下文 我們在寫乙個方法的時候,總是會用到乙個關鍵字thi...