core observer 之array處理方法

2021-10-08 02:18:10 字數 1959 閱讀 8456

/*

* 因為flow不能很好的處理動態獲取array原型上的方法,

* 所以該檔案不進行型別檢查

*/import

from

'../util/index'

const arrayproto = array.prototype

export

const arraymethods = object.

create

(arrayproto)

const methodstopatch =

['push'

,'pop'

,'shift'

,'unshift'

,'splice'

,'sort'

,'reverse'

]/**

* 攔截變更的方法,並emit事件

*/methodstopatch.

foreach

(function

(method)

if(inserted) ob.

observearray

(inserted)

// 觸發更新

ob.dep.

notify()

return result

})})

因為在object時,可以採用getter/setter的方法來監控資料,但是array可以通過原型上的方法來處理資料,這樣就監聽不到了。所以要將原型上的方法攔截,並返回攔截的方法。

const arrayproto = array.prototype

export

const arraymethods = object.

create

(arrayproto)

***其實就是乙個和array.prototype一樣的物件,只不過這個物件的一些可以改變陣列自身內容的方法,是經過處理的。

object.create()方法會建立乙個新物件,並使用先用物件來提供新建立物件的__proto__屬性。

const methodstopatch =

['push'

,'pop'

,'shift'

,'unshift'

,'splice'

,'sort'

,'reverse'

]

這是array原型中可以改變陣列自身內容的7個方法

def

(arraymethods, method,

function

mutator

(...args)

if(inserted) ob.

observearray

(inserted)

// 觸發更新

ob.dep.

notify()

return result

})

引入的def方法,def方法在observer類的時候講過,它是用來處理資料的,給資料新增乙個屬性,因為***是原型方法,所以可以直接通過this.__ob__來訪問observer例項。

mutator方法返回了需要返回乙個值,賦值給arraymethods[method],在mutator中,執行了原來array.prototype上的方法,並且觸發了當前observer例項的依賴變更,同時把值返回出去。

let inserted

switch

(method)

if(inserted) ob.

observearray

(inserted)

所以在執行上面7個方法的時候,實際執行的就是mutator裡的方法,在偵測資料變化的時候,用inserted來暫存新增的資料,然後如果有新資料,使用observer來偵測他們。

國內AR行業現狀研究之百度的AR

ar augmented reality 中文翻譯增強現實。按我原來的知識體系,vr ar的技術構成是相同的,只是追求的方向不同。vr是虛擬籠罩現實 讓虛擬就是現實 ar則讓虛擬進入現實。二者最終看似不同,但又殊途同歸,虛擬與現實的界限被模糊,唯心與唯物的哲學辯論進入下乙個輪迴。目前,所有的人工智慧...

AR技術之基本的功能(一)

1 arfoundation 我打算引入開放世界的技術方案是arfoundation,這套方案不侷限於arkit和arcore這樣的sdk,是乙個統一的,開放的ar開發平台。2 與arcore arkit之間的關係 arfoundation與arcore和arkit之間是乙個統籌的關係,開發人員通過...

AR 關於AR實時陰影的製作

原作者 大家都知道,ar本身對平行光的陰影是不現實的,之前用過momo的乙個方法實現了實時陰影,但是效果不是非常好,後面在論壇中發現了乙個比較實用的方法。話不多說,切入正題。首先 寫乙個shader用來作為接收光照陰影 properties cutoff alpha cutoff range 0,1...