JS自定義方法

2022-03-26 09:17:49 字數 1539 閱讀 2555

在c#中有delegate,還有特殊的可以直接應用於事件程式設計的delegate,那就是event。而在js中沒有c#的event,更沒有delegate,有的只是dom元素內建的的native的不可擴充套件的event,比如無法為input元素新增事件,只能在其擁有的事件(如onclick=handler)上擴充套件應用。那麼能不能做到自定義的事件模擬效果呢?答案是肯定的,也就是本文的主題。

首先弄明白一下事件的意圖——可以在發生一件事的時候執行額外的**,如document.attachevent('onclick', function()),當點選頁面時(事件發生了),就會執行我們為其掛接的其它**(js中以function為語句集合,以下稱為function),當然我們可以在乙個事件上掛接任意多的function,這樣就實現了一種靈活的可擴充套件程式設計介面。試想如果可以像在元素事件擴充套件應用一樣可以在任意物件的任意方法上擴充套件,那對於js程式設計來講就更加靈活了。先看乙個例子,平時我們把相對對立的乙個功能命名為乙個function,並在需要的地方(通常是另乙個function)呼叫以實現**復用:

function f()

} function g()

var f = new f();

f.method()

我們把f.method中直接呼叫g改寫一下,封裝到乙個event物件中達到一樣的效果,**如下:

var event = )

}, occor:function(obj, method)

for(var i=0; i} }

function f()

} var f = new f();

event.observe(f, 'method', function())

f.method()這樣乍看上去好像費了「太多」功夫,但卻把「在f中呼叫g的寫法」更通用化了,如果要在f中呼叫h則只需要多些一行event.occor(this, 'methodname'),寫到這裡你肯定也注意到methodname的寫法和最開始的寫法是一樣的,都是硬編的不具靈活性,如果在每個類的方法中都寫入event.occor(this, 'method')就太**觀了,也背離了我們的初衷,動態修改一下method把它加到最後一行就ok了,下一步就是解決它,改進**如下:

var event = )

}, occor:function(obj, method)

for(var i=0; i}, inject:function(obj)', 'event.occor(this,p)'))

} }

} function f()

} var f = new f();

event.inject(f);

event.observe(f, 'method', function())

f.method()我們把顯示的在被呼叫方法體內呼叫event.occor改寫到event.inject中。到此我們就簡單(還有一些安全**沒有處理,如沒有判斷obj[p]是否需要被改寫、沒有測試效率問題,沒有處理更多新增event.occor時的邏輯判斷,下一步準備把它實現為乙個observeable物件,就更加靈活了)的完成了自定義事件。

js自定義物件及其方法

js中定義類的方式有很多種 1 工廠方式 function car return ocar var car1 car var car2 car 呼叫此函式時將建立新物件,並賦予它所有的屬性和方法。使用此函式可以建立2個屬性完全相同的物件。當然我妹可以通過給它傳遞引數來改版這種方式。function ...

js自定義物件和方法

js中定義類的方式有很多種 1 工廠方式 function car return ocar var car1 car var car2 car 呼叫此函式時將建立新物件,並賦予它所有的屬性和方法。使用此函式可以建立2個屬性完全相同的物件。當然我妹可以通過給它傳遞引數來改版這種方式。function ...

js自定義屬性

1 js中設定自定義屬性。例如 div info attr testattr3 houhou 結果 給div設定了新的自定義屬性testattr3,值為houhou 2 js中獲取自定義屬性值。例如 div info attr testattr 結果 取到testattr的值為 myattr 3 j...