国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

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

BingqiChen / 2851人閱讀

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

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

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

Object.defineProperty(obj, prop, descriptor)

參數(shù)

obj:要在其上定義屬性的對(duì)象

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

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

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

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

configurable

當(dāng)且僅當(dāng)該屬性的 configurable 為 true 時(shí),該屬性描述符才能夠被改變,同時(shí)該屬性也能從對(duì)應(yīng)的對(duì)象上被刪除,如果為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對(duì)象的屬性將失效

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

enumerable

當(dāng)且僅當(dāng)該屬性的enumerable為true時(shí),該屬性才能夠出現(xiàn)在對(duì)象的枚舉屬性中(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]) //無(wú)輸出
}

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

value

該屬性對(duì)應(yīng)的值。可以是任何有效的 JavaScript 值(數(shù)值,對(duì)象,函數(shù)等)。默認(rèn)為 undefined。

writable

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

存取描述符其余屬性:

get

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

let animal = {}
let name = "cat"
Object.defineProperty(animal, "name", {
  value: "cat",
  get: function () {
    return name
  }
})
//報(bào)錯(cuò):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



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

set

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

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

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

可以借助中間值來(lái)解決

    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)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/104015.html

相關(guān)文章

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

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

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

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

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

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

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

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

    LuDongWei 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<