摘要:通過(guò)設(shè)置我們可以將一些屬性鎖定,來(lái)防止別人的修改,這是一種防御編程形式,就像語(yǔ)言的內(nèi)置對(duì)象一樣不過(guò)的內(nèi)置對(duì)象都可以被隨意更改??梢允褂脕?lái)判斷某一個(gè)屬性是否可以枚舉。
對(duì)象管理器(defineProperty)
在 JavaScript 里面聲明一個(gè)變量,通常我們有三種方式可以實(shí)現(xiàn):
let person = {} // 對(duì)象字面量 let cat = new Object() // new 運(yùn)算符 let dog = Object.create(null) // create 函數(shù)
我們可以簡(jiǎn)單的將 key 值和 value 值賦進(jìn)去,但在 ES5 中 JavaScript 提供了一個(gè)對(duì)象管理器的方法給我們,讓我們可以很精細(xì)的對(duì)每一個(gè)屬性定制它們的行為,我們分別可以為屬性設(shè)置:
可配置特性(configurable)
可枚舉屬性(enumerable)
可以寫特性(writable)
值(value)
設(shè)置 getter 方法(get)
設(shè)置 setter 方法(set)
首先讓我們看看如何使用Object.defineProperty來(lái)定制屬性吧:
let person = {} Object.defineProperty(person, "name", { configurable: true, enumerable: true, writeable: true, value: "_我已經(jīng)從中二畢業(yè)了" }) Object.defineProperty(person, "age", { configurable: true, enumerable: true, writeable: true, value: 18 }) console.log(person.name) // _我已經(jīng)從中二畢業(yè)了 console.log(person.age) // 18
通過(guò)上面的代碼可以看出 Object.defineProperty 這個(gè)函數(shù)能夠接受三個(gè)參數(shù):
obj:需要定義屬性的對(duì)象
prop:需被定義或修改的屬性名
descriptor:需被定義或修改的屬性的描述符
語(yǔ)法:
可配置特性(configurable)Object.defineProperty(obj, prop, descriptor)
當(dāng) configurable 這個(gè)屬性為 true 的時(shí)候表示這個(gè)屬性可以從父對(duì)象中刪除。當(dāng) configurable 設(shè)置為 false 的時(shí)候就會(huì)鎖定這個(gè)屬性,無(wú)法被修改。通過(guò)設(shè)置 configurable 我們可以將一些屬性鎖定,來(lái)防止別人的修改,這是一種防御編程形式,就像語(yǔ)言的內(nèi)置對(duì)象一樣(不過(guò) JavaScript 的內(nèi)置對(duì)象都可以被隨意更改)。
let person = {} Object.defineProperty(person, "name", { configurable: false, value: "_我已經(jīng)從中二畢業(yè)了" }) Object.defineProperty(person, "age", { configurable: true, value: 18 }) delete person.name console.log(person.name) // _我已經(jīng)從中二畢業(yè)了 delete person.age console.log(person.age) // undefined person.name = "John" console.log(person.name) // _我已經(jīng)從中二畢業(yè)了 person.age = 19 console.log(person.age) // 19可枚舉屬性(enumerable)
一般來(lái)說(shuō)我們會(huì)通過(guò)for in操作來(lái)遍歷可以枚舉的屬性。當(dāng)然我們也可以設(shè)置屬性為不可枚舉,這些屬性就不能夠被枚舉了,從而防止遍歷查找到這個(gè)屬性??梢允褂?propertyIsEnumerable 來(lái)判斷某一個(gè)屬性是否可以枚舉。
let person = {} Object.defineProperty(person, "name", { enumerable: true, value: "_我已經(jīng)從中二畢業(yè)了" }) Object.defineProperty(person, "age", { enumerable: false, value: 18 }) // 只輸出了 name for (var key in person) { console.log(key) } console.log(Object.keys(person)) // ["name"] console.log(Object.getOwnPropertyNames(person)) // ["name", "age"] console.log(person.propertyIsEnumerable("name")) // true console.log(person.propertyIsEnumerable("age")) // false console.log(person.age) // 18可以寫特性(writable)
當(dāng) writable 為 true 的時(shí)候,與屬性相關(guān)聯(lián)的值是可以更改的。否則,值就不能改變。
let person = {} let person2 = person Object.defineProperty(person, "name", { writable: false, value: "_我已經(jīng)從中二畢業(yè)了" }) Object.defineProperty(person, "age", { writable: true, value: 18 }) person.name = "John" console.log(person.name) // _我已經(jīng)從中二畢業(yè)了 console.log(person2.name) // _我已經(jīng)從中二畢業(yè)了 person.age = 19 console.log(person.age) // 19 console.log(person.age) // 19 person2.name = "John" console.log(person.name) // _我已經(jīng)從中二畢業(yè)了 console.log(person2.name) // _我已經(jīng)從中二畢業(yè)了 person2.age = 20 console.log(person.age) // 20 console.log(person.age) // 20相關(guān)鏈接
Object.defineProperty()
Object.keys()
Object.getOwnPropertyNames()
Object.prototype.propertyIsEnumerable()
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/79332.html
摘要:其中,描述符對(duì)象的屬性必須是和。吧設(shè)置為,表示不能從對(duì)象中刪除屬性。這個(gè)方法接收兩個(gè)對(duì)象參數(shù)要添加和修改其屬性值的對(duì)象,第二個(gè)是與第一個(gè)對(duì)象中要添加和修改的屬性值一一對(duì)應(yīng)。 理解對(duì)象 1、創(chuàng)建自定義對(duì)象的兩種方法: (1)創(chuàng)建一個(gè)Object實(shí)例,然后再為它添加屬性和方法。 var person = new Object(); person.name = Nicholas; ...
摘要:訂閱者的實(shí)現(xiàn)如下將自己添加到訂閱器的操作緩存自己強(qiáng)行執(zhí)行監(jiān)聽器里的函數(shù)釋放自己到此為止,簡(jiǎn)單版的設(shè)計(jì)完畢,這時(shí)候我們需要將和關(guān)聯(lián)起來(lái),就可以實(shí)現(xiàn)一個(gè)簡(jiǎn)單的雙向數(shù)據(jù)綁定了。同樣使用數(shù)據(jù)劫持。。 什么是雙向綁定 簡(jiǎn)單說(shuō)就是在數(shù)據(jù)和UI之間建立雙向的通信通道,當(dāng)用戶通過(guò)Function改變了數(shù)據(jù),那么這個(gè)改變也會(huì)立即反映到UI上;或者說(shuō)用戶通過(guò)UI的操作也會(huì)隨之引起對(duì)應(yīng)的數(shù)據(jù)變動(dòng)。Vue是如...
摘要:數(shù)據(jù)屬性有個(gè)描述其行為的特性。表示能否通過(guò)刪除屬性從而重新定義屬性,能否修改屬性的特性,或者能否把屬性修改為訪問(wèn)器屬性。表示能否修改屬性的值。其中,描述符對(duì)象的屬性必須是和。返回值被傳遞給函數(shù)的對(duì)象。 屬性類型 ECMAScript中有兩種屬性:數(shù)據(jù)屬性和訪問(wèn)器屬性。數(shù)據(jù)屬性:數(shù)據(jù)屬性包含一個(gè)數(shù)據(jù)值的位置。在這個(gè)位置可以讀取和寫入值。數(shù)據(jù)屬性有4個(gè)描述其行為的特性。 [[Configu...
摘要:上一篇你不知道的筆記寫在前面這是年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響年是向上的一年在新的城市穩(wěn)定連續(xù)堅(jiān)持健身三個(gè)月早睡早起游戲時(shí)間大大縮減,學(xué)會(huì)生活。 上一篇:《你不知道的javascript》筆記_this 寫在前面 這是2019年第一篇博客,回顧去年年初列的學(xué)習(xí)清單,發(fā)現(xiàn)僅有部分完成了。當(dāng)然,這并不影響2018年是向上的一年:在新的城市穩(wěn)定、...
摘要:雙向數(shù)據(jù)綁定簡(jiǎn)言之?dāng)?shù)據(jù)動(dòng)頁(yè)面動(dòng),頁(yè)面動(dòng),數(shù)據(jù)動(dòng)典型的應(yīng)用就是在做表單時(shí)候,輸入框的內(nèi)容改動(dòng)后,跟該輸入框的的值改動(dòng)。看官網(wǎng)上的這個(gè)的演示案例雙向數(shù)據(jù)綁定的好處要說(shuō)出這個(gè)好處的時(shí)候,也只有在實(shí)際場(chǎng)景中才能對(duì)應(yīng)的顯示出來(lái)。 前言:本系列學(xué)習(xí)筆記從以下幾個(gè)點(diǎn)展開 什么是雙向數(shù)據(jù)綁定 雙向數(shù)據(jù)綁定的好處 怎么實(shí)現(xiàn)雙向數(shù)據(jù)綁定 實(shí)現(xiàn)雙向數(shù)據(jù)數(shù)據(jù)綁定需要哪些知識(shí)點(diǎn) 數(shù)據(jù)劫持 發(fā)布訂閱模式 ...
閱讀 2659·2021-10-11 10:58
閱讀 1253·2021-09-29 09:34
閱讀 1659·2021-09-26 09:46
閱讀 3906·2021-09-22 15:31
閱讀 801·2019-08-30 15:54
閱讀 1531·2019-08-30 13:20
閱讀 1311·2019-08-30 13:13
閱讀 1554·2019-08-26 13:52