如何限制JS对象属性的配置

JavaScript里对象的属性是公开的,一般是不受保护的,即属性的修改/ 添加 / 添加不受限制,但是在一些应用情境下,又需要对对象的属性做一些限制。

第一种情况:对属性的修改、增加、删除做限制

Object.preventExtensions()

  • 限制了不能向对象中新添加属性和方法了
  • 但可以修改对象中存在的属性,也可以删除原有属性和方法

Object.isExtensible():可以确定对象是否为可篡改,如果可篡改,则返回true,相反返回false。

Object.seal()

密封对象

  • 不能新添加属性、不能删除属性。拥有了不可扩展对象的特性。
  • 但可以修改属性

Object.isSealed():判断是否为密封对象/对象属性可否修改

Object.freeze()

冻结对象

  • 不可扩展的:不能增加或删除属性
  • 也是密封的:不能修改属性值

Object.defineProperty()

该方法的第三个参数:设置属性描述性
将第三个参数设:writable: falseconfigurable: 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 区别:前者可配置多个属性,后者是配置一个属性

利用对象的defineGetterdefineSetter 方法

(注:该这两个方法IE不支持)
定义了对象后,就可以用这两个方法来定位 setter 和 getter 方法

你可能感兴趣的:(如何限制JS对象属性的配置)