無限呼叫之鏈模式分析

2021-09-11 09:13:22 字數 2413 閱讀 3391

鏈模式相信大家很常見,尤其在jq中,我們非常習慣的可以使用jq的鏈式模式中連續的進行方法的呼叫,雖然我們知道其在方法執行後會返回this的當前物件,來實現這個模式的設計,我們還是進行更加詳細的研究學習吧。

首先我們知道的是鏈模式是基於原型,比如我們在假設我們的方法為a。我們現在的方法和屬性都是定義在原型鏈上,a本身是方法,我們通過例項化方法可以訪問到原型鏈上的方法。

function

a (){}

a.prototype =

}let a = new a()

console.log(a.size()) //2

// 沒有size 是因為方法定義在原型鏈上

console.log(a.size())

// 沒有size執行是因為a方法的執行沒有任何返回值

console.log(a().size())

複製**

但是這樣是有問題的,我們知道jq的方式是直接用返回物件並沒有例項化的方法,那我們可以進行借助另乙個物件來實現。

我們可以借助另外的物件進行,上面講到a().size()不行是因為a方法沒有任何任何值,那麼我們可以進行返回。如下的方式改造就可以直接a方法呼叫函式了。

function

a ()

let b = a.prototype =

}console.log(a().size()) //2

// 為了減少變數的建立,我們直接用a的屬性來承接

a.fn = a.prototype =

}複製**

我們知道jq最終是為了獲取元素的集合,所以目前的方式肯定是不合適的。所以我們需要在原型物件上定義乙個init方法來獲取物件。那麼我們需要在a方法執行的時候直接返回我們的初始化方法。

function

a (seletor)

a.fn = a.prototype = ,

length:2,

size:function()

}console.log(a("demo")) // dom

複製**

雖然之前的設計可以得到元素了,但這樣的元素不具有我們想要的方法,那麼如何讓返回的元素具有我們想要的方法呢,在方法體重我們可以看到a.fn是具有我們的方法的。

function

a (seletor)

a.fn = a.prototype = ,

length:2,

size:function()

}console.log(a("demo").size()) // 1 得到校驗後的長度

複製**

此時發現另外的問題了,就是我們進行另外乙個元素的使用時,元素會互相覆蓋,原因是因為我們每次都是返回利用的同乙個物件。

解決覆蓋獲取的方式也很簡單,恢復例項化即可。但這樣也會導致方法無法使用。報錯如下:a(...).size is not a function

function

a (seletor)

複製**

原因是因為前者返回的是當前物件,也就是a.fn和a.prototype,但如果是new的進行的是屬性的複製,與前面不同。

經過測試,init方法中第一種方式返回的確實是a.fn,a.prototype,而如果是返回new a.fn.init,那麼返回的是a.fn.a.init

直接將a.fn的原型指向存在的物件即可。

a.fn.init.prototype = a.fn

複製**

這樣就可以滿足我們的基本需求了。

上面的**可以實現獲取id元素的標籤,但實際上我們有各種可能,這種時候只要判斷選擇器的內容,然後針對性的獲取元素就好。

init:function(selector,context)

...}複製**

雖然我們實現了基本的方法,但發現仍然存在乙個使用上的特性,就是jq的元素支援陣列的很多操作,為了讓我們的返回物件也具有類似的功能,我們需要在原型鏈上追加push\sort\split等類似陣列的方法來實現。

a.fn = a.prototype = 

複製**

a.extend = a.fn.extend = function()

for(;ifor(j in

arguments[i])

}return target ;

}複製**

所以如果你要新增方法,你直接用就可以。

a.fn.extend = ( else 

}// 返回this 支援鏈式呼叫

return

this

}})複製**

useEffect無限呼叫問題

1.useefect 的基本用法 const test,settest usestate 1 const init useeffect test 紅色 test 則是監聽的資料,這裡的監聽資料要分為兩種,1是基本資料型別,2是物件和陣列 2.監聽原理基本理解.簡單來說就是當修改後的值不同於修改之前就...

系統呼叫之lseek

注意 這個指標是和檔案描述符相掛鉤的,並不與這個檔案掛鉤,所以可以有多個程序來對這個檔案進行操作,不會影響各自。當從檔案讀取資料時,核心從指標指向的位置開始,讀取指定的位元組數,然後移動指標,指向下乙個未被讀取過的位元組,寫檔案的過程也是類似。off t oldpos lseek int fd,of...

cppIntergration 呼叫 cu模組

main.cpp extern c bool runtest const int argc,const char ar char data,int2 data int2,unsigned int len 在主程式裡使用extern c 將.cu函式擴充套件到所有檔案可用cppintegration....