作者:JohnAu-Yeung译者:FrontendXiaozhi来源:Medium已经收录了,之前好评文章的更多分类,也整理了我的大量文档和教程资料。欢迎来到星和完美。面试时可参考考点复习。我希望我们能在一起。除了正常的对象属性赋值和遍历之外,我们还可以对JavaScript对象执行许多其他操作。在本文中,我们将了解如何使用它们,包括访问内部属性、操作属性描述符和继承只读属性。1.访问内部属性JavaScript对象具有不能以正常方式访问的内部属性。内部属性名称用方括号[[]]括起来,在对象创建时可用。内部属性不能动态添加到现有对象。内部属性可用于某些内置JavaScript对象,这些对象存储ECMAScript规范指定的内部状态。有两个内部属性,一个用于操作对象,另一个用于存储数据。例如:[[Prototype]]-对象的原型,可以为null或object[[Extensible]]-表示是否允许在对象中动态添加新的属性[[PrivateFieldValues]]-用于管理私有类fields2.属性描述Specifier对象数据属性包含一个数据值位置,可以在该位置读取和写入值。也就是说可以通过object.attribute访问数据属性,也就是我们平时接触的用户赋什么值,他们就返回什么,不会做额外的事情。一个数据属性有四个描述其行为的属性(为了表示内部值,将属性放在两个方括号中),称为描述符对象。属性说明默认值[[Configurable]]可以通过delete删除属性重新定义属性;attributetrue[[Writable]]可以修改属性的值true[[Value]]包含了这个属性的数据值undefinedvalue描述符是属性的数据值,比如我们有如下对象: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:真实的,可配置的:真实的,});所以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.继承的只读属性不能赋值。无法分配继承的只读属性。这是有道理的,因为我们这样设置它,它是继承的,所以它应该传播到继承该属性的对象。我们可以使用Object.create创建一个从原型对象继承属性的对象,如下所示:constproto=Object.defineProperties({},{a:{value:1,writable:false}})constfoo=Object.create(proto)在上面的代码中,我们将proto.a的可写描述符设置为false,所以我们不能再给它赋值。如果我们写:foo.a=2;在严格模式下,我们会收到一条错误消息。总之,我们可以用JavaScript对象做很多我们可能不知道的事情。首先,某些JavaScript对象(例如内置的浏览器对象)具有内部属性,由双方括号括起来,它们具有无法通过对象创建动态添加的内部状态。JavaScript对象属性也有属性描述符,可以让我们控制它们的值以及是否可以设置,或者它们的属性描述符是否可以改变等。我们可以使用defineProperty改变一个属性的属性描述符,它也用于添加新属性及其属性描述符。最后,继承的只读属性保持只读,这是有道理的,因为它是从父原型对象继承的。代码部署后可能存在的bug,无法实时获知。事后为了解决这些bug,花费了大量的时间在日志调试上。顺便推荐一个好用的bug监控工具Fundebug。原文:https://medium.com/@amesimmon...交流文章每周更新。可以微信搜索“大千世界”阅读即时更新(比博文早一两篇)。这篇文章在GitHub上https://github.com/qq449245884/xiaozhi已经收录,整理了很多我的文档。欢迎明星和完美。面试可以参考考点。也关注公众号,后台就能看到福利了。你说对了。
