资讯专栏INFORMATION COLUMN

Javascript(Object.seal)

godiscoder / 1511人阅读

摘要:使用小细节这几天遇到一个坑,讲的是保护对象的其中一种方法。封闭方法可以让一个对象密封,并返回被密封后的对象。但是有个例外,允许非配置属性从可写状态变成只读状态,因为数组的属性总是可写的且不可配置。如果没有这个例外就不能冻结数组。

Javascript(Object.seal)&使用小细节

这几天遇到一个坑,讲的是js保护对象的其中一种方法。封闭(Sealing)
Object.seal(obj)

Object.seal()
方法可以让一个对象密封,并返回被密封后的对象。密封对象是指那些不能添加新的属性,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性,但可能可以修改已有属性的值的对象。

调用了seal这个函数,会把属性的configurable设置为false,也就是不能修改他的属性特性。
不知道各位有没有发现其中有一个小小的问题。configurable明明设置为false,但是我还是可以修改它的可写性,writable从原来的true->false。
后来经过一番查书之后,才发现一个小小的细节。

configurable持有一个布尔值,如果它是false,那么你不能删除、改变属性的人和特性,除了value,也不能把它从数据属性转换为访问其属性,反之亦然,它控制着属性元数据的可写性。但是有个例外,js允许非配置属性从可写状态变成只读状态,因为数组的属性length总是可写的且不可配置。如果没有这个例外就不能冻结数组。

所以如果是一开始使用默认的可写性writable=true;他是可以被允许在configurable为false的时候改变成为false的。那这时候问题又来了, 如果我已经显性设置了可写性为true呢?

t.foo也是被改变成为false,所以说明不管显隐性声明可写行,在不可配置的情况下依然可以总是可以被从可读可写改为只读。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/80311.html

相关文章

  • 如何禁止JavaScript对象重写?

    摘要:译者按使用和,可以禁止重写对象。引入了一些方法,允许开发者限制对象重写。不要重写他人的对象不要重写他人的对象,这是的黄金法则。如果你修改的是对象比如,这会导致非常严重的后果。 译者按: 使用Object.preventExtensions()、Object.seal()和Object.freeze(),可以禁止重写JavaScript对象。 译者:Fundebug 原文:Preve...

    jubincn 评论0 收藏0
  • javascript中对象的常用方法,深克隆和浅克隆以及冻结,扩展,密封三大属性的区别

    摘要:它将返回目标对象。封闭对象方法判断一个对象是否被密封。为源对象为修改的属性名或设置,同上方法返回一个给定对象自身可枚举属性的键值对数组方法返回指定对象上一个自有属性对应的属性描述符方法判断两个值是否是相同的值。 对象作为引用类型,工作中免不了复制对象,下面来看看克隆的方法 Object.assign() 方法用于将所有可枚举属性的值从一个或多个源对象复制到目标对象。它将返回目标对象。浅...

    gplane 评论0 收藏0
  • JavaScript设置对象的不可拓展

    摘要:一般来说,默认情况下,对象都是可拓展的,我们可以为其属性进行增删改等操作,也可以更改他们原型的指向,如何让一个对象变得不可拓展呢,我们可以使用提供的几个方法,来保证锁定的对象是不可拓展的可以锁定对象,设置对象的不可拓展,可以阻止为对象添加新 一般来说,默认情况下,对象都是可拓展的,我们可以为其属性进行增删改等操作,也可以更改他们原型的指向,如何让一个对象变得不可拓展呢,我们可以使用ES...

    freewolf 评论0 收藏0
  • Object 的各种方法

    摘要:等同于构造函数与的用法很相似,几乎一模一样。实例对象的方法接受一个字符串作为参数,返回一个布尔值,表示该实例对象自身是否具有该属性。等同于方法生成的对象,继承了它的原型对象的构造函数。 分类 Object() 函数 Object 本身是一个函数,用来将任意值转为对象。 如果参数为空(或者为 undefined 和 null),Object() 返回一个空对象。 var obj = Ob...

    gghyoo 评论0 收藏0
  • 标准库(二)属性描述对象

    摘要:也就是说,属性控制了属性描述对象的可写性。可遍历性返回一个布尔值,表示目标属性是否可遍历运算符不管某个属性是对象自身的还是继承的,都会返回。上面的写法与定义属性描述对象是等价的,而且使用更广泛。 属性描述对象 概述Object.getOwnPropertyDescriptor()Object.getOwnPropertyNames()Object.defineProperty(),Ob...

    MartinDai 评论0 收藏0

发表评论

0条评论

godiscoder

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<