JavaScript里對(duì)象的屬性是公開(kāi)的,一般是不受保護(hù)的,即屬性的修改/ 添加 / 添加不受限制久信,但是在一些應(yīng)用情境下,又需要對(duì)對(duì)象的屬性做一些限制裙士。
第一種情況:對(duì)屬性的修改入客、增加、刪除做限制
Object.preventExtensions()
- 限制了不能向?qū)ο笾行绿砑訉傩院头椒?/li>
- 但可以修改對(duì)象中存在的屬性腿椎,也可以刪除原有屬性和方法
Object.isExtensible():可以確定對(duì)象是否為可篡改痊项,如果可篡改,則返回true酥诽,相反返回false鞍泉。
Object.seal()
密封對(duì)象
- 不能新添加屬性、不能刪除屬性肮帐。擁有了不可擴(kuò)展對(duì)象的特性咖驮。
- 但可以修改屬性
Object.isSealed():判斷是否為密封對(duì)象/對(duì)象屬性可否修改
Object.freeze()
凍結(jié)對(duì)象
- 不可擴(kuò)展的:不能增加或刪除屬性
- 也是密封的:不能修改屬性值
Object.defineProperty()
該方法的第三個(gè)參數(shù):設(shè)置屬性描述性
將第三個(gè)參數(shù)設(shè):writable: false
和 configurable: false
以此將該屬性設(shè)置為 不可寫(xiě) 和 不可配置
Proxy
Proxy :代理,可以在外界訪問(wèn)對(duì)象時(shí) 做攔截训枢。
利用 Proxy對(duì)象 可以 限制對(duì)象增加/刪除/修改 屬性
利用 proxy 對(duì)象的第二個(gè)參數(shù):配置對(duì)象 做相應(yīng)的配置
- 限制增加和修改屬性:
set
方法里做限制 - 限制刪除屬性:
deleteProperty
第二種情況:具體配置對(duì)象屬性
上面提到的四種方法只是針對(duì)防止屬性的修改/增加/刪除托修,并無(wú)涉及如何對(duì)屬性做具體的配置,以下則是具體的如何對(duì)JS對(duì)象增加 getter 和 setter 恒界,即獲取屬性和修改屬性時(shí)的 操作
Object.create()
這個(gè)方法可創(chuàng)造一個(gè)對(duì)象睦刃,可以指定它的原型和一些屬性
Object.create(proto, [ propertiesObject ])
第一個(gè)參數(shù):傳入一個(gè)對(duì)象,創(chuàng)建的新對(duì)象以這個(gè)對(duì)象為原型
第二個(gè)參數(shù):可配置屬性十酣,也是一個(gè)對(duì)象
???????????????????????對(duì)象的屬性名稱:想要進(jìn)行配置的屬性涩拙;
????????????????????????屬性值:屬性描述符,在這里對(duì)屬性做配置耸采。
屬性描述符:是來(lái)描述屬性的特征的兴泥。
setter和getter 是函數(shù)對(duì),針對(duì)屬性的獲取和設(shè)置時(shí)的功能
writable
:來(lái)設(shè)置屬性可寫(xiě)不可寫(xiě)的虾宇,為true或者false;
configurable
:設(shè)置屬性可否配置的
enumerable
: 設(shè)置屬性可否枚舉
注:若想判斷屬性描述符的特征(可否寫(xiě)可否配置可否枚舉等…):
Object.getOwnPropertyDescriptor(obj, prop)
Object.defineProperty()
Object.defineProperty(obj, prop, descriptor)
第一個(gè)參數(shù)是要配置屬性的那個(gè)對(duì)象搓彻,
第二個(gè)參數(shù):要配置的屬性,
第三個(gè)參數(shù):屬性描述符
Object.defineProperties
類似 Object.defineProperty嘱朽,
和 Object.defineProperty 區(qū)別:前者可配置多個(gè)屬性旭贬,后者是配置一個(gè)屬性
利用對(duì)象的defineGetter 和defineSetter 方法
(注:該這兩個(gè)方法IE不支持)
定義了對(duì)象后,就可以用這兩個(gè)方法來(lái)定位 setter 和 getter 方法