摘要:可以是任何有效的值數(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, #
如果一個(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
摘要:當(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)注...
摘要:前言最近在學(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,完成...
摘要:當(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版本 【...
摘要:下面我們會(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上了。我...
閱讀 746·2021-11-23 09:51
閱讀 2447·2021-10-11 11:10
閱讀 1319·2021-09-23 11:21
閱讀 1101·2021-09-10 10:50
閱讀 898·2019-08-30 15:54
閱讀 3337·2019-08-30 15:53
閱讀 3299·2019-08-30 15:53
閱讀 3196·2019-08-29 17:23