当前位置: 首页 > 科技观察

JavaScript对象可以做的三件事

时间:2023-03-13 01:32:39 科技观察

除了正常的对象属性赋值和遍历,我们还可以对JavaScript对象执行许多其他操作。在本文中,我们将了解如何使用它们,包括访问内部属性、操作属性描述符和继承只读属性。1.访问内部属性JavaScript对象无法以正常方式访问“内部属性”。“内部属性”名称被方括号[[]]包围,在创建对象时可用。“内部属性”不能动态添加到现有对象。“内部属性”可用于某些内置JavaScript对象,这些对象存储ECMAScript规范指定的内部状态。有两个“内部属性”,一个用于操作对象,另一个用于存储数据。例如:[[Prototype]]-对象的原型,可以为null或object[[Extensible]]-表示是否允许动态添加新的属性到对象中[[PrivateFieldValues]]-用于管理privateclassfields2.PropertydescriptionSpecifier对象的数据属性包含一个数据值位置,可以读写值。也就是说可以通过object.attribute访问数据属性,也就是我们平时接触的用户赋什么值,他们就返回什么,不会做额外的事情。一个数据属性有四个描述其行为的属性(为了表示内部值,将属性放在两个方括号中),称为“描述符对象”。值描述符是属性的数据值。例如,我们有如下对象:letfoo={a:1}那么,a的value属性描述符为1。可写是指该属性的值是否可以改变。默认值为true,表示该属性是可写的。但是,我们可以通过多种方式使其不可写。可配置意味着对象的属性可以被删除或者它的属性描述符可以被改变。默认值为true,这意味着它是可配置的。enumerable表示它可以被for...in循环遍历。默认值为true,表示在通过返回属性的for-in循环将属性键添加到返回数组之前,Object.keys方法还会检查可枚举描述符。但是,Reflect.ownKeys方法不检查此属性描述符,而是返回所有自己的属性键。原型描述符还有其他方法,get和set分别用于获取和设置值。在创建新对象时,我们可以使用Object.defineProperty方法来设置描述符,如下所示:letfoo={a:1}Object.defineProperty(foo,'b',{value:2,writable:true,enumerable:true,可配置:真,});所以foo的新值是{a:1,b:2}。我们还可以使用defineProperty更改现有属性的描述符。例如:letfoo={a:1}Object.defineProperty(foo,'a',{value:2,writable:false,enumerable:true,configurable:true,});这样当我们尝试给foo.a赋值时,例如:foo.a=2;如果关闭严格模式,浏览器会忽略它,否则会抛出错误,因为我们将writable设置为false,表示该属性不可写。我们还可以使用defineProperty将属性转换为getter,如下所示:'usestrict'letfoo={a:1}Object.defineProperty(foo,'b',{get(){return1;}})当我们写When:foo.b=2;因为b属性是一个getter属性,所以在使用严格模式的时候,我们会报错:Getterpropertiescannotbereassigned。3.Inheritedread-onlypropertiescannotbeassignedInheritedread-onlypropertiescannotbeassigned。这是有道理的,因为我们这样设置它,它是继承的,所以它应该传播到继承该属性的对象。我们可以使用Object.create创建一个从原型对象继承属性的对象,如下所示:constproto=Object.defineProperties({},{a:{value:1,writable:false}})constfoo=Object.create(proto)在上面的代码中,我们将proto.a的可写描述符设置为false,所以我们不能再给它赋值。如果我们写:foo.a=2;在严格模式下,我们会收到错误信息。总之,我们可以用JavaScript对象做很多我们可能不知道的事情。首先,某些JavaScript对象(例如内置的浏览器对象)具有内部属性,由双方括号括起来,它们具有无法通过对象创建动态添加的内部状态。JavaScript对象属性也有属性描述符,可以让我们控制它们的值以及是否可以设置,或者它们的属性描述符是否可以改变等。我们可以使用defineProperty改变一个属性的属性描述符,它也用于添加新属性及其属性描述符。最后,继承的只读属性保持只读,这是有道理的,因为它是从父原型对象继承的。本文转载自微信公众号“伟大的走向世界”,您可以通过以下二维码关注。转载本文请联系大千世界公众号。