JS實現過載

2022-09-15 05:57:08 字數 1614 閱讀 6824

在js中,我們實現過載常用的方式有:

1、根據傳入引數的型別執行不同的操作。

2、利用引數中特殊的引數值進行不同的操作。

3、根據引數的個數進行過載。

這裡對第三種過載方式的實現進行說明。

實現第三種方法,最簡單的就是使用switch case進行引數個數的判斷,然後執行相應的操作,但這樣的判斷方法導致**不是很整潔,逼格也不算是太高。

如:

function

fn()

}

下面介紹一種方法,先不考慮是否適用,但可以通過了解這種過載方式,讓我們學到一些js中的技巧和對閉包的一些理解。畢竟多了解些不算件壞事。

先上**:

var arr =;

bindmethod(arr, "find", function

() );

bindmethod(arr, "find", function

(a) );

bindmethod(arr, "find", function

(a, b) );

function

bindmethod(obj, name, fn)

else}}

arr.find(); //0

arr.find(1); //

1 arr.find(1, 2); //

2 arr.find(1, 2, 3); ///**

第一次進行繫結時,先賦值old,因為attr.find並沒有被建立,所以old=undefined。然後為arr物件find屬性建立乙個匿名方法,這個匿名方法fn.length=0。

第二次進行繫結時,將old物件指向第一次建立的匿名方法,然後會將arr物件find屬性指向到當前建立的匿名方法,因為old指向上個方法的引用,這就會造成上個方法不會被釋放。

第三次也是一樣的步驟,保證第二次繫結的方法不會被釋放。

過載方法的執行,像乙個鏈條一樣,先從最後繫結的方法內部開始尋找 方法定義的引數個數和傳入的個數是否匹配,如果匹配則返回當前的傳入的匿名函式,否則繼續向上查詢,直到找到為止。

如果最後沒有找到結果,當前程式會報錯,因為第一次繫結方法時,old物件是乙個undefined

**/

繫結階段

先將arr繫結三個方法,每個方法都有乙個old的物件,存放之前儲存的方法,以此類推,(當前的方法中,old物件都會指向上一次繫結方法,但是注意,在第一次繫結的方法中,old物件是undefind),這樣就可以形成乙個鏈條。也就是說記憶體中分別有三個attr.find的記憶體空間,都指向各自建立bindmethod內的匿名方法。

呼叫階段

當傳入0個引數,進行呼叫時,會先呼叫最後乙個繫結的方法。然後進行判斷,如果傳入引數為2個,則返回匿名方法,否則

呼叫old指向的上個方法。再次進入,再次進行判斷,直到找到符合引數個數的方法,返回它的匿名函式。

在這裡對於attr物件的繫結,其實是進行了三次繫結覆蓋的操作,依次進行對attr.find進行賦值,最後只保留最後一次的賦值物件。

這也是為什麼在進行呼叫時,是從最後一次繫結的方法中開始執行的原因。對於attr.find方法被覆蓋,但卻沒有被自動釋放的原因是因為新方法的old

始終指向被覆蓋的方法,所以這裡產生了閉包。

js中實現過載

js中不支援過載,得使用arguments模擬 arguments是乙個變數,有且僅有乙個屬性length。會以陣列的形式儲存了函式執行過程中傳遞過來的實際引數,即使函式定義沒有那麼多引數。看下邊這個例子 function sayhi name,msg function sayhi name 當想呼...

JS如何實現過載和多型

可以理解乙個方法被不同實現後 展現不同的效果及狀態。js本身不支援過載,所以只能通過其他方式實現,arguments檢測傳參的個數,然後再執行不同的方式 function add return sum alert add alert add 1 2 alert add 1 2 3 function ...

js模擬實現過載以及預設引數

眾所周知,js是函式不支援過載和預設引數的,但是我們可以使用一些其他方法來模擬這個方法的實現。首先看一下過載的定義 函式名相同,函式的引數列表不同 包括引數個數和引數型別 至於返回型別可同可不同。以及預設引數的定義 預設引數指的是當函式呼叫中省略了實參時自動使用的乙個值。那麼如何實現這兩個功能呢,乙...