亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

vue2響應(yīng)式原理之Object.defineProperty()方法的使用

 更新時(shí)間:2023年10月07日 09:52:19   作者:山海入夢(mèng)  
這篇文章主要介紹了vue2響應(yīng)式原理之Object.defineProperty()方法的使用,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

前言

最近一直在研究vue2響應(yīng)式原理,去官網(wǎng)看一遍文檔,好像懂了但又好像不懂,然后去查看別人寫(xiě)的響應(yīng)式原理和視頻,好的理解了百分六七十頭皮發(fā)麻,vue2的響應(yīng)式原理實(shí)現(xiàn)的核心就是Object.defineProperty()方法,所以自己也跟著手敲一下響應(yīng)式源碼記錄對(duì)Object.defineProperty的理解

一、Object.defineProperty()

1.概念

Object.defineProperty() 方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性,并返回此對(duì)象.

這句話到底什么意思呢?

我們簡(jiǎn)單實(shí)現(xiàn)這個(gè)方法

var obj = {}
Object.defineProperty(obj, 'name', {
  value:'科比'
})
console.log(obj.name)  //科比

可以看出Object.defineProperty()能為我們定義一個(gè)屬性,又有人會(huì)想為什么我們不直接定義obj.name='科比',而使用這個(gè)方法不更加麻煩嗎?

2.Object.definProperty()方法

可以設(shè)置額外隱藏的屬性使用這些屬性能夠使對(duì)象更加自由的被定義

var obj = {}
Object.defineProperty(obj, 'name', {
  value:'科比',
  //是否可寫(xiě)
  writable: false 
})
Object.defineProperty(obj, 'number', {
  value:24,
  //是否可枚舉
  enumerable: false 
})
//修改屬性報(bào)錯(cuò)
obj.name = "庫(kù)里"  //Cannot assign to read only property 'name' of object '#<Object>'
console.log(obj.name)  

通過(guò)obj對(duì)象定義writable: false 使你屬性不能修改,如果修改obj.name就會(huì)報(bào)錯(cuò);enumerable是否可以枚舉,所以使用這些屬性能夠使對(duì)象更加自由的被定義

二、Object.definProperty()方法的get()和set()

代碼如下(示例):

通過(guò)這個(gè)示例可知訪問(wèn)obj.name屬性就會(huì)觸發(fā)get()方法,修改obj.name屬性觸發(fā)set()方法

但是我們發(fā)現(xiàn)修改obj.name屬性為"喬丹",打印為undefined這是為什么呢?

看一下get和set方法的介紹:

get

  • 屬性的 getter 函數(shù),如果沒(méi)有 getter,則為 undefined。當(dāng)訪問(wèn)該屬性時(shí),會(huì)調(diào)用此函數(shù)。
  • 執(zhí)行時(shí)不傳入任何參數(shù),但是會(huì)傳入 this 對(duì)象(由于繼承關(guān)系,這里的this并不一定是定義該屬性的對(duì)象)。
  • 該函數(shù)的返回值會(huì)被用作屬性的值。
  • 默認(rèn)為 undefined。

set

  • 屬性的 setter 函數(shù),如果沒(méi)有 setter,則為 undefined。
  • 當(dāng)屬性值被修改時(shí),會(huì)調(diào)用此函數(shù)。
  • 該方法接受一個(gè)參數(shù)(也就是被賦予的新值),會(huì)傳入賦值時(shí)的 this 對(duì)象。
  • 默認(rèn)為 undefined。

因?yàn)間et的函數(shù)返回值會(huì)被當(dāng)作屬性的值,而我們示例中g(shù)et和set沒(méi)有return 任何值,就默認(rèn)為undefined,修改后:

const obj = {}
Object.defineProperty(obj , 'name' , {
  get(){
    console.log('訪問(wèn)obj.name屬性觸發(fā)')
    return "喬丹"
  },
  set(newValue) {
    console.log('修改obj.name屬性觸發(fā)' , newValue)
  }
})
obj.name  //訪問(wèn)屬性
console.log(obj.name)  //喬丹
obj.name = "科比"  //修改屬性
console.log(obj.name)  //喬丹

 

能夠訪問(wèn)到設(shè)置的obj屬性了,但是修改了obj.name = "科比"

最后打印還是"喬丹" ,但是set方法觸發(fā)的newValue是科比這又是為什么呢?

因?yàn)間etter并不能返回你修改的值,只要你訪問(wèn)obj.name他就是返回return "喬丹"

就如同你設(shè)置的set新屬性從未改變一樣非常固執(zhí),那么我們應(yīng)該怎么解決這個(gè)問(wèn)題呢?

我們可以通過(guò)一個(gè)變量com進(jìn)行周轉(zhuǎn),修改如下:

var obj = {}
var com;  //設(shè)置變量周轉(zhuǎn)
Object.defineProperty(obj , 'name' , {
  get(){
    console.log('訪問(wèn)obj.name屬性觸發(fā)')
    return com
  },
  set(newValue) {
    console.log('修改obj.name屬性觸發(fā)' , newValue)
    com = newValue
  }
})
obj.name  //訪問(wèn)屬性
console.log(obj.name)  //喬丹
obj.name = "科比"  //修改屬性科比
console.log(obj.name)  //最后控制臺(tái)打印 科比

詳細(xì)了解Object.defineProperty()方法

總結(jié)

vue2的響應(yīng)式原理核心就是基于Object.defineProperty()方法實(shí)現(xiàn)的喲,不過(guò)完整的響應(yīng)式源碼可不止這樣簡(jiǎn)單,所以下一篇博客就是手敲完整vue2響應(yīng)式源碼實(shí)現(xiàn),加深理解.

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • vue移動(dòng)端UI框架實(shí)現(xiàn)QQ側(cè)邊菜單組件

    vue移動(dòng)端UI框架實(shí)現(xiàn)QQ側(cè)邊菜單組件

    這篇文章主要介紹了vue移動(dòng)端UI框架實(shí)現(xiàn)仿qq側(cè)邊菜單組件,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下
    2018-03-03
  • vue3中安裝并使用CSS預(yù)處理器Sass的方法詳解

    vue3中安裝并使用CSS預(yù)處理器Sass的方法詳解

    Sass是一種CSS預(yù)處理器,它擴(kuò)展了CSS的功能,提供了更高級(jí)的語(yǔ)法和特性,例如變量、嵌套、混合、繼承和顏色功能等,這些特性可以幫助開(kāi)發(fā)者更高效地管理和維護(hù)樣式表,本文介紹vue3中安裝并使用CSS預(yù)處理器Sass的方法,感興趣的朋友一起看看吧
    2024-01-01
  • Vue ElementUI中Upload組件批量上傳的實(shí)現(xiàn)代碼

    Vue ElementUI中Upload組件批量上傳的實(shí)現(xiàn)代碼

    ElementUI中Upload組件批量上傳通過(guò)獲取upload組件的DOM、文件、上傳地址和數(shù)據(jù),封裝uploadFiles方法,使用ajax方式上傳多個(gè)文件,后臺(tái)接口接收多文件并返回上傳結(jié)果,本文介紹Vue ElementUI中Upload組件如何批量上傳,感興趣的朋友一起看看吧
    2025-02-02
  • 傳說(shuō)中VUE的語(yǔ)法糖到底是做什么的

    傳說(shuō)中VUE的語(yǔ)法糖到底是做什么的

    從接觸Vue我們就知道 v-model是實(shí)現(xiàn)數(shù)據(jù)雙向綁定的那他能實(shí)現(xiàn)綁定的原理到底是啥?最常見(jiàn)的語(yǔ)法糖 v-model,今天通過(guò)案例給大家詳細(xì)介紹下,需要的朋友參考下吧
    2021-09-09
  • Vue首評(píng)加載速度及白屏?xí)r間優(yōu)化詳解

    Vue首評(píng)加載速度及白屏?xí)r間優(yōu)化詳解

    這篇文章主要介紹了vue項(xiàng)目?jī)?yōu)化首評(píng)加載速度,以及白屏?xí)r間過(guò)久的問(wèn)題,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-09-09
  • 使用vue實(shí)現(xiàn)滑動(dòng)滾動(dòng)條來(lái)加載數(shù)據(jù)

    使用vue實(shí)現(xiàn)滑動(dòng)滾動(dòng)條來(lái)加載數(shù)據(jù)

    在vuejs中,我們經(jīng)常使用axios來(lái)請(qǐng)求數(shù)據(jù),但是有時(shí)候,我們請(qǐng)求的數(shù)據(jù)量很大,那么我們?nèi)绾螌?shí)現(xiàn)滑動(dòng)滾動(dòng)條來(lái)加載數(shù)據(jù)呢,接下來(lái)小編就給大家介紹一下在vuejs中如何實(shí)現(xiàn)滑動(dòng)滾動(dòng)條來(lái)動(dòng)態(tài)加載數(shù)據(jù),需要的朋友可以參考下
    2023-10-10
  • Vuex狀態(tài)機(jī)的快速了解與實(shí)例應(yīng)用

    Vuex狀態(tài)機(jī)的快速了解與實(shí)例應(yīng)用

    Vuex是專門(mén)為Vuejs應(yīng)用程序設(shè)計(jì)的狀態(tài)管理工具,這篇文章主要給大家介紹了關(guān)于Vuex狀態(tài)機(jī)快速了解與實(shí)例應(yīng)用的相關(guān)資料,需要的朋友可以參考下
    2021-06-06
  • vue3+elementPlus實(shí)現(xiàn)年份選擇器

    vue3+elementPlus實(shí)現(xiàn)年份選擇器

    這篇文章主要為大家詳細(xì)介紹了vue3如何通過(guò)elementPlus實(shí)現(xiàn)一個(gè)簡(jiǎn)單的年份選擇器,文中的示例代碼講解詳細(xì),需要的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • vue日歷組件的封裝方法

    vue日歷組件的封裝方法

    這篇文章主要為大家詳細(xì)介紹了vue封裝一個(gè)日歷組件的方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • Vue實(shí)現(xiàn)自定義右擊刪除菜單的示例

    Vue實(shí)現(xiàn)自定義右擊刪除菜單的示例

    本文主要介紹了Vue實(shí)現(xiàn)自定義右擊刪除菜單的示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-02-02

最新評(píng)論