成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

從Vue源碼學(xué)習(xí)JavaScript之Object.defineproperty

BingqiChen / 2874人閱讀

摘要:可以是任何有效的值數(shù)值,對象,函數(shù)等。當(dāng)且僅當(dāng)該屬性的為時,才能被賦值運(yùn)算符改變。存取描述符其余屬性一個給屬性提供的方法,如果沒有則為。當(dāng)屬性值修改時,觸發(fā)執(zhí)行該方法。該方法將接受唯一參數(shù),即該屬性新的參數(shù)值。

Vue里面有個耳熟能詳?shù)脑~是Object.defineproperty,這篇文章就介紹一下這個屬性。

Object.defineProperty() 方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現(xiàn)有屬性, 并返回這個對象。
語法

Object.defineProperty(obj, prop, descriptor)

參數(shù)

obj:要在其上定義屬性的對象

prop:要定義或者要修改的屬性

descriptor:將被定義或修改的屬性描述符

descriptor屬性描述符
屬性描述符又可分為數(shù)據(jù)描述符和存取描述符,可以用getOwnPropertyDescriptors或者getOwnPropertyDescriptor獲取到屬性描述

數(shù)據(jù)描述符和存取描述符共有的屬性包括:

configurable

當(dāng)且僅當(dāng)該屬性的 configurable 為 true 時,該屬性描述符才能夠被改變,同時該屬性也能從對應(yīng)的對象上被刪除,如果為false,則不能刪除或修改writable, configurable, enumerable。默認(rèn)為 true。

var animal = {
    name: "cat"
}
console.log(Object.getOwnPropertyDescriptors(animal)) 
//name: {value: "cat", writable: true, enumerable: true, configurable: true}
console.log(animal.name) //cat
delete animal.name
console.log(animal.name) //undefined

Object.defineProperty(animal, "name", {
    value: "dog",
    configurable: false
})
console.log(Object.getOwnPropertyDescriptors(animal))
//name: {value: "dog", writable: false, enumerable: false, configurable: false}
console.log(animal.name) //dog
delete animal.name
console.log(animal.name) //dog

可以看到,configurable默認(rèn)屬性是true,設(shè)置為false之后,delete對象的屬性將失效

需要注意的是,如果不是通過defineproperty定義的屬性,描述符默認(rèn)值都是true;通過defineproperty定義的屬性,描述符默認(rèn)是false

enumerable

當(dāng)且僅當(dāng)該屬性的enumerable為true時,該屬性才能夠出現(xiàn)在對象的枚舉屬性中(for...in, Object.keys())。默認(rèn)為 true。

let animal = {
    name: "cat"
 }
for (let i in animal) {
    console.log(animal[i]) //cat
}
Object.defineProperty(animal, "name", {
    enumerable: false
})
for (let i in animal) {
    console.log(animal[i]) //無輸出
}

數(shù)據(jù)描述符其余屬性:

value

該屬性對應(yīng)的值??梢允侨魏斡行У?JavaScript 值(數(shù)值,對象,函數(shù)等)。默認(rèn)為 undefined。

writable

當(dāng)且僅當(dāng)該屬性的writable為true時,value才能被賦值運(yùn)算符改變。默認(rèn)為 true。

存取描述符其余屬性:

get

一個給屬性提供 getter 的方法,如果沒有 getter 則為 undefined。當(dāng)訪問該屬性時,該方法會被執(zhí)行,方法執(zhí)行時沒有參數(shù)傳入,但是會傳入this對象(由于繼承關(guān)系,這里的this并不一定是定義該屬性的對象)。

let animal = {}
let name = "cat"
Object.defineProperty(animal, "name", {
  value: "cat",
  get: function () {
    return name
  }
})
//報錯:Uncaught TypeError: Invalid property descriptor. Cannot both specify accessors and a value or writable attribute, #

let animal = {}
let name = "cat"
Object.defineProperty(animal, "name", {
    get: function () {
      return name
    }
})
console.log(animal.name) //cat



如果一個描述符不具有value,writable,get 和 set 任意一個關(guān)鍵字,那么它將被認(rèn)為是一個數(shù)據(jù)描述符。如果一個描述符同時有(value或writable)和(get或set)關(guān)鍵字,將會產(chǎn)生一個異常。

set

一個給屬性提供 setter 的方法,如果沒有 setter 則為 undefined。當(dāng)屬性值修改時,觸發(fā)執(zhí)行該方法。該方法將接受唯一參數(shù),即該屬性新的參數(shù)值。

let animal = {}
let name = "cat"
Object.defineProperty(animal, "name", {
    get: function () {
      return name
    },
    set: function (val) {
      name = val
    }
})

如果訪問者的屬性是被繼承的,它的 get 和set 方法會在子對象的屬性被訪問或者修改時被調(diào)用。如果這些方法用一個變量存值,該值會被所有對象共享。

可以借助中間值來解決

    let animal = {}
    let name = "cat"
    Object.defineProperty(animal, "name", {
        get: function () {
          return this.stored_x
        },
        set: function (val) {
          this.stored_x = val
        }
    })

    

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/104015.html

相關(guān)文章

  • JavaScript 進(jìn)階深入理解數(shù)據(jù)雙向綁定

    摘要:當(dāng)我們的視圖和數(shù)據(jù)任何一方發(fā)生變化的時候,我們希望能夠通知對方也更新,這就是所謂的數(shù)據(jù)雙向綁定。返回值返回傳入函數(shù)的對象,即第一個參數(shù)該方法重點(diǎn)是描述,對象里目前存在的屬性描述符有兩種主要形式數(shù)據(jù)描述符和存取描述符。 前言 談起當(dāng)前前端最熱門的 js 框架,必少不了 Vue、React、Angular,對于大多數(shù)人來說,我們更多的是在使用框架,對于框架解決痛點(diǎn)背后使用的基本原理往往關(guān)注...

    sarva 評論0 收藏0
  • vue框架的基本原理,簡單實(shí)現(xiàn)一個todo-list

    摘要:前言最近在學(xué)習(xí)框架的基本原理,看了一些技術(shù)博客以及一些對源碼的簡單實(shí)現(xiàn),對數(shù)據(jù)代理數(shù)據(jù)劫持模板解析變異數(shù)組方法雙向綁定有了更深的理解。 前言 最近在學(xué)習(xí)vue框架的基本原理,看了一些技術(shù)博客以及一些對vue源碼的簡單實(shí)現(xiàn),對數(shù)據(jù)代理、數(shù)據(jù)劫持、模板解析、變異數(shù)組方法、雙向綁定有了更深的理解。于是乎,嘗試著去實(shí)踐自己學(xué)到的知識,用vue的一些基本原理實(shí)現(xiàn)一個簡單的todo-list,完成...

    Karrdy 評論0 收藏0
  • Vue原理】依賴收集 - 源碼基本數(shù)據(jù)類型

    摘要:當(dāng)東西發(fā)售時,就會打你的電話通知你,讓你來領(lǐng)取完成更新。其中涉及的幾個步驟,按上面的例子來轉(zhuǎn)化一下你買東西,就是你要使用數(shù)據(jù)你把電話給老板,電話就是你的,用于通知老板記下電話在電話本,就是把保存在中。剩下的步驟屬于依賴更新 寫文章不容易,點(diǎn)個贊唄兄弟專注 Vue 源碼分享,文章分為白話版和 源碼版,白話版助于理解工作原理,源碼版助于了解內(nèi)部詳情,讓我們一起學(xué)習(xí)吧研究基于 Vue版本 【...

    VincentFF 評論0 收藏0
  • 源碼解析 —— Vue的響應(yīng)式數(shù)據(jù)流

    摘要:下面我們會向大家解釋清楚為什么這個這么重要,以及它和的響應(yīng)式數(shù)據(jù)流有什么關(guān)系。源碼前面鋪墊這么多就是希望大家能理解接下來要講的響應(yīng)式數(shù)據(jù)流??偨Y(jié)講到這里大家應(yīng)該都能夠明白的響應(yīng)式數(shù)據(jù)流是如何實(shí)現(xiàn)的。 Vue、React介紹 目前前端社區(qū)比較推崇的框架有Vue 和 React,公司內(nèi)部許多端都自發(fā)的將原有的老技術(shù)方案(widget + jQuery)遷移到 Vue / React上了。我...

    LuDongWei 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<