JavaScript里对象的属性是公开的,一般是不受保护的,即属性的修改/ 添加 / 添加不受限制,但是在一些应用情境下,又需要对对象的属性做一些限制。
第一种情况:对属性的修改、增加、删除做限制
Object.preventExtensions()
- 限制了不能向对象中新添加属性和方法了
- 但可以修改对象中存在的属性,也可以删除原有属性和方法
Object.isExtensible():可以确定对象是否为可篡改,如果可篡改,则返回true,相反返回false。
Object.seal()
密封对象
- 不能新添加属性、不能删除属性。拥有了不可扩展对象的特性。
- 但可以修改属性
Object.isSealed():判断是否为密封对象/对象属性可否修改
Object.freeze()
冻结对象
- 不可扩展的:不能增加或删除属性
- 也是密封的:不能修改属性值
Object.defineProperty()
该方法的第三个参数:设置属性描述性
将第三个参数设:writable: false
和 configurable: false
以此将该属性设置为 不可写 和 不可配置
Proxy
Proxy :代理,可以在外界访问对象时 做拦截。
利用 Proxy对象 可以 限制对象增加/删除/修改 属性
利用 proxy 对象的第二个参数:配置对象 做相应的配置
- 限制增加和修改属性:
set
方法里做限制 - 限制删除属性:
deleteProperty
第二种情况:具体配置对象属性
上面提到的四种方法只是针对防止属性的修改/增加/删除,并无涉及如何对属性做具体的配置,以下则是具体的如何对JS对象增加 getter 和 setter ,即获取属性和修改属性时的 操作
Object.create()
这个方法可创造一个对象,可以指定它的原型和一些属性
Object.create(proto, [ propertiesObject ])
第一个参数:传入一个对象,创建的新对象以这个对象为原型
第二个参数:可配置属性,也是一个对象
对象的属性名称:想要进行配置的属性;
属性值:属性描述符,在这里对属性做配置。
属性描述符:是来描述属性的特征的。
setter和getter 是函数对,针对属性的获取和设置时的功能
writable
:来设置属性可写不可写的,为true或者false;
configurable
:设置属性可否配置的
enumerable
: 设置属性可否枚举
注:若想判断属性描述符的特征(可否写可否配置可否枚举等…):
Object.getOwnPropertyDescriptor(obj, prop)
Object.defineProperty()
Object.defineProperty(obj, prop, descriptor)
第一个参数是要配置属性的那个对象,
第二个参数:要配置的属性,
第三个参数:属性描述符
Object.defineProperties
类似 Object.defineProperty,
和 Object.defineProperty 区别:前者可配置多个属性,后者是配置一个属性
利用对象的defineGetter 和defineSetter 方法
(注:该这两个方法IE不支持)
定义了对象后,就可以用这两个方法来定位 setter 和 getter 方法