詳解Object.defineProperty缓升,Proxy,Reflect

Object.defineProperty

Object.defineProperty會在一個對象上添加一個屬性蕴轨,獲者修改一個屬性港谊,截取的是對象的屬性
方法接收三個參數(shù)(obj,key,desc)

屬性描述符的類型有兩種

  • 數(shù)據(jù)屬性(Data Properties)描述符(Descriptor)
  • 存取屬性(Accessor訪問器 Properties)描述符(Descriptor)


    desc

    1.數(shù)據(jù)屬性描述符

//在直接定義一個對象,所有的數(shù)據(jù)特性都是為true
var obj = {
  name: 'jack',
  age: 18,
};

//在使用數(shù)據(jù)描述符時,所有的默認(rèn)特性都是為false
//configurable和enumerable + value和writable
Object.defineProperty(obj, 'address', {
  //屬性的值,默認(rèn)為undefined
  value: 'ad',
  //是否可以配置進行delete關(guān)鍵字進行刪除,
  configurable: true,
  //可枚舉,進行循環(huán)遍歷時是否可以拿到相應(yīng)的key
  enumerable: true,
  //屬性是否可以寫入值
  writable: true,
});
  1. 存取描述符
var obj = {
  name: 'jack',
  age: 18,
  _address: 'xxx',
};

//configurable和enumerable + get和set方法
//1.在不想私有屬性被暴露,可以通過數(shù)據(jù)存取描述符進行代理
//2.可以收集依賴,

Object.defineProperty(obj, 'address', {
  enumerable: true,
  configurable: true,
  get: function () {
    return this._address; //在訪問address時代理給_address
  },
  set: function (value) {
    return this._address = value; //在設(shè)置新的值時賦值給_address
  },
});
obj.address = 'aaa';
console.log(obj.address);

vue2的響應(yīng)式原理就是應(yīng)用了存取描述符,在get時將屬性在哪個地方使用時收集依賴,當(dāng)屬性被改變時,在set方法自動更新在哪個地方使用的屬性值
但是Object.defineProperty設(shè)計的初衷橙弱,不是為了去監(jiān)聽截止一個對象中所有的屬性的歧寺,我們在定義某些屬性的時候,初衷其實是定義普通的屬性棘脐,但是后面我們強行將它變成了數(shù)據(jù)屬性描述符斜筐,其次,如果我們想監(jiān)聽更加豐富的操作蛀缝,比如新增屬性顷链、刪除屬性,那么Object.defineProperty是無能為力的屈梁,所有js在es6的更新的時候加了一個Proxy類

Proxy

在ES6中嗤练,新增了一個Proxy類,這個類從名字就可以看出來在讶,是用于幫助我們創(chuàng)建一個代理的煞抬,也就是說,如果我們希望監(jiān)聽一個對象的相關(guān)操作真朗,那么我們可以先創(chuàng)建一個代理對象(Proxy對象),之后對該對象的所有操作僧诚,都通過代理對象來完成遮婶,代理對象可以監(jiān)聽我們想要對原對象進行哪些操作

const obj = {
name:'jack',
age:18
}
const objproxy =new Proxy(obj)

當(dāng)下次需要操作obj時,可以先操作代理對象

Proxy的set和get捕獲器

get函數(shù)有三個參數(shù):

  • target:目標(biāo)對象(偵聽的對象)湖笨;
  • property:被獲取的屬性key旗扑;
  • receiver:調(diào)用的代理對象
    set函數(shù)有四個參數(shù):
  • target:目標(biāo)對象(偵聽的對象);
  • property:將被設(shè)置的屬性key慈省;
  • value:新屬性值臀防;
  • receiver:調(diào)用的代理對象

Proxy所有捕獲器

Proxy捕獲器

Proxy給對象提供了13種捕獲器,在進行代理對象的時候基本上都涵蓋所有的操作边败,利用Proxy進行響應(yīng)式是非常好的選擇

Reflect

Reflect也是ES6新增的一個API袱衷,它是一個對象,字面的意思是反射
主要作用

  • 它主要提供了很多操作JavaScript對象的方法笑窜,有點像Object中操作對象的方法
  • 比如Reflect.getPrototypeOf(target)類似于 Object.getPrototypeOf()
  • 比如Reflect.defineProperty(target, propertyKey, attributes)類似于Object.defineProperty()
    和Object是類似的致燥,但是為什么還要新增一個呢,這是因為在早期的ECMA規(guī)范中沒有考慮到這種對 對象本身 的操作如何設(shè)計會更加規(guī)范排截,所以將這些API放到了Object上面嫌蚤,為了規(guī)范在es6中新增了Reflect類辐益,可以去看一下Object和Reflect的區(qū)別

Reflect的常見方

reflect

Reflect的使用

一般都是在set中傳入數(shù)據(jù),然后直接將newValue賦值給val

const objProxy = new Proxy(obj,{
set(targrt,key,newValue){
return target[key] = newValue
}
})

但是這種直接操作是在原對象上直接操作數(shù)據(jù)的脱吱,本來是用了一個對象代理智政,但是在操作數(shù)據(jù)的時候還是操作原對象的,為了能夠不直接更改原數(shù)據(jù)箱蝠,這里可以利用reflect將數(shù)據(jù)進行一個代理续捂,就像下面的這樣使用


image.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市抡锈,隨后出現(xiàn)的幾起案子疾忍,更是在濱河造成了極大的恐慌,老刑警劉巖床三,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件一罩,死亡現(xiàn)場離奇詭異,居然都是意外死亡撇簿,警方通過查閱死者的電腦和手機聂渊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來四瘫,“玉大人汉嗽,你說我怎么就攤上這事≌颐郏” “怎么了饼暑?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長洗做。 經(jīng)常有香客問我弓叛,道長,這世上最難降的妖魔是什么诚纸? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任撰筷,我火速辦了婚禮,結(jié)果婚禮上畦徘,老公的妹妹穿的比我還像新娘毕籽。我一直安慰自己,他們只是感情好井辆,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布关筒。 她就那樣靜靜地躺著,像睡著了一般杯缺。 火紅的嫁衣襯著肌膚如雪平委。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天夺谁,我揣著相機與錄音廉赔,去河邊找鬼肉微。 笑死,一個胖子當(dāng)著我的面吹牛蜡塌,可吹牛的內(nèi)容都是我干的碉纳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼馏艾,長吁一口氣:“原來是場噩夢啊……” “哼劳曹!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起琅摩,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤铁孵,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后房资,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蜕劝,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年轰异,在試婚紗的時候發(fā)現(xiàn)自己被綠了岖沛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡搭独,死狀恐怖婴削,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情牙肝,我是刑警寧澤唉俗,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站配椭,受9級特大地震影響虫溜,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颂郎,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一吼渡、第九天 我趴在偏房一處隱蔽的房頂上張望容为。 院中可真熱鬧乓序,春花似錦、人聲如沸坎背。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽得滤。三九已至陨献,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間懂更,已是汗流浹背眨业。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工急膀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人龄捡。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓卓嫂,卻偏偏與公主長得像,于是被迫代替她去往敵國和親聘殖。 傳聞我的和親對象是個殘疾皇子晨雳,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355

推薦閱讀更多精彩內(nèi)容