一.什么是Proxy?
Proxy 對(duì)象是ES6新出的一個(gè)特性,用于創(chuàng)建一個(gè)對(duì)象的代理,從而實(shí)現(xiàn)基本操作的攔截和自定義(如屬性查找、賦值、枚舉、函數(shù)調(diào)用等)。
需要知道的是,在Vue2中雙向數(shù)據(jù)綁定原理(數(shù)據(jù)劫持)采用Object.defineProperty,而在Vue3中數(shù)據(jù)劫持原理采用的是Proxy代理。
二.為什么Proxy會(huì)取代Object.defineProperty?
Object.defineProperty只能劫持對(duì)象的屬性,不能監(jiān)聽數(shù)組。也不能對(duì) es6 新產(chǎn)生的 Map,Set 這些數(shù)據(jù)結(jié)構(gòu)做出監(jiān)聽。也不能監(jiān)聽新增和刪除操作等等。
Proxy可以直接監(jiān)聽整個(gè)對(duì)象而非屬性,可以監(jiān)聽數(shù)組的變化,具有多達(dá)13中攔截方法。
————————————————
總而言之,Proxy 對(duì)象是ES6新出的一個(gè)特性,用于創(chuàng)建一個(gè)對(duì)象的代理,從而實(shí)現(xiàn)基本操作的攔截和自定義(如屬性查找、賦值、枚舉、函數(shù)調(diào)用等)。在Vue3中數(shù)據(jù)劫持原理采用的是Proxy代理。Proxy可以直接監(jiān)聽整個(gè)對(duì)象而非屬性,可以監(jiān)聽數(shù)組的變化,具有多達(dá)13中攔截方法。
● get(target,propKey,receiver):攔截對(duì)象屬性的讀取
● set(target,propKey,value,receiver):攔截對(duì)象屬性的設(shè)置
● has(target,propKey):攔截propKey in proxy的操作,返回一個(gè)布爾值
● deleteProperty(target,propKey):攔截delete proxy[propKey]的操作,返回一個(gè)布爾值
● ownKeys(target):攔截Object.keys(proxy)、for...in等循環(huán),返回一個(gè)數(shù)組
● getOwnPropertyDescriptor(target, propKey):攔截Object.getOwnPropertyDescriptor(proxy, propKey),返回屬性的描述對(duì)象
● defineProperty(target, propKey, propDesc):攔截Object.defineProperty(proxy, propKey, propDesc),返回一個(gè)布爾值
● preventExtensions(target):攔截Object.preventExtensions(proxy),返回一個(gè)布爾值
● getPrototypeOf(target):攔截Object.getPrototypeOf(proxy),返回一個(gè)對(duì)象
● isExtensible(target):攔截Object.isExtensible(proxy),返回一個(gè)布爾值
● setPrototypeOf(target, proto):攔截Object.setPrototypeOf(proxy, proto),返回一個(gè)布爾值
● apply(target, object, args):攔截 Proxy 實(shí)例作為函數(shù)調(diào)用的操作
● construct(target, args):攔截 Proxy 實(shí)例作為構(gòu)造函數(shù)調(diào)用的操作
留言反饋