摘要:默認(rèn)情況下,使用添加的屬性是不可變的。是讀取屬性時(shí)調(diào)用,一般要返回,是寫(xiě)入屬性時(shí)調(diào)用,不用返回。和訪問(wèn)器不是對(duì)象的屬性,而是屬性的特性,特性只有在內(nèi)部才會(huì)使用,也就是接口不會(huì)暴露。只定義,則屬性是只讀。
Object.defineProperty()解讀
第一個(gè)栗子:實(shí)現(xiàn)js雙向數(shù)據(jù)綁定(借用網(wǎng)上的例子)
首先,將結(jié)構(gòu)先搭建好
方式一:使用最基礎(chǔ)的寫(xiě)法
document.addEventListener("keyup", function (e) { var str = e.target.value||""; document.getElementById("txt1").value = str; document.getElementById("txt2").value = str; })
該方法使用主動(dòng)賦值的方式同步數(shù)據(jù)
方式二:Object.defineProperty()
將所有的監(jiān)聽(tīng)和響應(yīng)操作交給Object的自定義存取器屬性,先看實(shí)現(xiàn)的代碼,稍后具體解讀2333333
/* 只要給obj.dataBind賦值,就會(huì)觸發(fā)set方法,只要訪問(wèn)ob.dataBind,就會(huì)觸發(fā)get方法 */ var obj = {}; Object.defineProperty(obj, "dataBind", { get: function () { return this.newValue; }, set: function (newValue) { this.newValue = newValue || ""; document.getElementById("txt1").value = this.newValue; document.getElementById("txt2").value = this.newValue; } }) document.addEventListener("keyup", function (e) { obj.dataBind = e.target.value; /*這步操作是調(diào)用obj.dataBind.set(e.target.value)*/ })
這里的dataBind屬性是會(huì)替換obj的默認(rèn)的dataBind,如果有設(shè)置的話。
運(yùn)行
第二個(gè)栗子:實(shí)現(xiàn)階乘
代碼:
/* *使用get/set特性實(shí)現(xiàn)階乘功能 */ var obj = {}; Object.defineProperty(obj,"factorial",{ get:function(){ return this.result; }, set:function(num){ this.result = 1; for(var i=1;i<=num;i++){ this.result *= i; } } }) document.addEventListener("keydown",function(e){ var even = e||event; if(even.keyCode==13){ obj.factorial = document.getElementById("factorial").value; document.getElementsByTagName("p")[0].innerText = "階乘的結(jié)果是:"+obj.factorial; } })
運(yùn)行
要改變屬性的get/set特性,有兩種方式:
設(shè)置單個(gè)屬性:Object.defineProperty()
該方法會(huì)直接在一個(gè)對(duì)象上定義一個(gè)新屬性,或者修改一個(gè)對(duì)象的現(xiàn)有屬性,并返回這個(gè)對(duì)象。
默認(rèn)情況下,使用Object.defineProperty添加的屬性是不可變的。
語(yǔ)法:Object.defineProperty(obj,prop,descriptor)
obj:需要定義屬性的對(duì)象
prop:需要定義或修改的屬性名
descriptor:被定義或修改的屬性描述
設(shè)置多個(gè)屬性O(shè)bject.defineProperties()
語(yǔ)法: Object.defineProperties(obj, props)
get/set
get和set屬性稱(chēng)為“存取器屬性”,當(dāng)屬性被定義為存取器屬性時(shí),js會(huì)忽略賦值的屬性,直接使用定義的get或set的值。
get是讀取屬性時(shí)調(diào)用,一般要返回,set是寫(xiě)入屬性時(shí)調(diào)用,不用返回。
get和set訪問(wèn)器不是對(duì)象的屬性,而是屬性的特性,特性只有在內(nèi)部才會(huì)使用,也就是接口不會(huì)暴露。
get和set訪問(wèn)器可以不用定義,不定義也可以讀寫(xiě)屬性值。只定義get,則屬性是只讀。只定義set,則屬性是只寫(xiě)。
最后我是參考網(wǎng)上很多例子,按照自己的思路整理出來(lái)的,可能也會(huì)有很多疏漏,先這樣吧
竟然學(xué)會(huì)了用gif圖演示,哈哈哈
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/94693.html
摘要:方式使用原始的和標(biāo)記設(shè)置方式使用原型方法進(jìn)行設(shè)置使用和進(jìn)行設(shè)置 /** * 方式1:使用原始的set 和 get標(biāo)記設(shè)置 * @type {Object} */ var obj1 = { name: shaanxi, get nameGet() { return this.name; ...
摘要:觀察員由模板解析指令創(chuàng)建的觀察員負(fù)責(zé)模板中的更新視圖操作。觀察員種類(lèi)目前了解情況來(lái)看主要分三類(lèi)視圖指令的計(jì)算屬性的用戶自定義的 介紹 關(guān)于 Vue.js 的原理一直以來(lái)都是一個(gè)話題。經(jīng)過(guò)幾天的源碼學(xué)習(xí)和資料介紹,我將一些個(gè)人理解的經(jīng)驗(yàn)給寫(xiě)下來(lái),希望能夠與大家共勉。 附上GITHUB源碼地址, 如果有任何不解 可以在 文章下面提出或者寫(xiě)下issue, 方便大家回答和學(xué)習(xí), 有興趣可以St...
摘要:所以這是一篇插隊(duì)的文章,用于去理解中的裝飾器和概念。因此,該的作用就是根據(jù)入?yún)⒎祷鼐唧w的描述符。其次局部來(lái)看,裝飾器具體應(yīng)用表達(dá)式是,其函數(shù)簽名和是一模一樣。等裝飾器語(yǔ)法,是和直接使用是等效等價(jià)的。 ================前言=================== 初衷:以系列故事的方式展現(xiàn) MobX 源碼邏輯,盡可能以易懂的方式講解源碼; 本系列文章: 《【用故事解...
摘要:目錄無(wú)繼承簡(jiǎn)單的字段聲明無(wú)繼承簡(jiǎn)單的方法聲明簡(jiǎn)單繼承一層繼承字段覆蓋無(wú)繼承靜態(tài)函數(shù)無(wú)繼承靜態(tài)變量神秘的類(lèi)無(wú)繼承簡(jiǎn)單的字段聲明先來(lái)看個(gè)最簡(jiǎn)單的例子,我們僅僅使用了關(guān)鍵字并定義了一個(gè)變量最后編譯出來(lái)的代碼如下。無(wú)繼承靜態(tài)變量還有個(gè)小例子。 在[上一篇文章][]中,我們提到 ES6 的 class 語(yǔ)法糖是個(gè)近乎完美的方案,并且講解了實(shí)現(xiàn)繼承的許多內(nèi)部機(jī)制,如 prototype/__pro...
摘要:源碼簡(jiǎn)記整體會(huì)寫(xiě)得比較亂,同時(shí)也比較簡(jiǎn)單,和讀書(shū)筆記差不多,基本是邊讀邊寫(xiě)。見(jiàn)諒主要三大部分的原子類(lèi),能夠被觀察和通知變化,繼承于。同時(shí)里面有幾個(gè)比較重要的屬性與方法。 Mobx 源碼簡(jiǎn)記 整體會(huì)寫(xiě)得比較亂,同時(shí)也比較簡(jiǎn)單,和讀書(shū)筆記差不多,基本是邊讀邊寫(xiě)。見(jiàn)諒~ 主要三大部分Atom、Observable、Derivation Atom Mobx的原子類(lèi),能夠被觀察和通知變化,obs...
閱讀 3469·2021-09-22 15:01
閱讀 590·2019-08-30 11:11
閱讀 1041·2019-08-29 16:17
閱讀 1265·2019-08-29 12:23
閱讀 2081·2019-08-26 11:48
閱讀 3235·2019-08-26 11:48
閱讀 1481·2019-08-26 10:33
閱讀 2004·2019-08-26 10:30