资讯专栏INFORMATION COLUMN

JavaScript设置对象的不可拓展

freewolf / 945人阅读

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

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

Object.preventExtensions

Object.preventExtensions可以锁定对象,设置对象的不可拓展,可以阻止为对象添加新的属性,非严格模式下会默默不起作用,但是严格模式下会报错,可以用Object.isExtensible判断对象是否可拓展

var person = {
  name: "cala"
};

Object.preventExtensions(person);

person.name = "John"; 
person.age = 24;
// 严格模式下会报错: TypeError: Cannot add property age, object is not extensible

console.log(person) 
// {name: "John"}

Object.seal

Object.seal和上面的Object.preventExtensions方法作用是一样,字面意思是密封,也是用来防止对象被拓展,另外还可以阻止对象已有属性和方法的删除,可以用Object.isSealed判断对象是否可拓展

var person = {
  name: "cala"
};

Object.seal(person);

console.log(Object.isExtensible(person)); // false
console.log(Object.isSealed(person)); // true

delete person.name 
//  删除属性失败 严格模式下 Uncaught TypeError: Cannot delete property "name" of #

person.age = 30; // 
// 严格模式下会报错: TypeError: Cannot add property age, object is not extensible

console.log(person) // {name: "cala"}

Object.freeze

作用与上述两个方法大致相同,字面意思是冰冻,还可以阻止对象的属性和方法被修改,可以用Object.isFrozen判断对象是否可拓展

var person = {
  name: "cala"
};

Object.freeze(person);

console.log(Object.isExtensible(person)); // false
console.log(Object.isSealed(person)); // true
console.log(Object.isFrozen(person)); // true

person.name = "xyz"; 
person.age = 30;     
delete person.name  
//上述三个操作,非严格模式不起作用,严格模式会报错

console.log(person) // {name: "cala"}

总的来说,上述三个操作方法preventExtensions,seal,freeze可以设置对象的不可拓展性,并且每个方法都针对对象的不可拓展有着不同的限制,另外还有三个判断方法,isExtensible,isSealed,isFrozen来对对象进行操作,返回Boolean值,来判断对象是否可拓展

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

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

相关文章

  • js知识梳理1:理解对象属性特性

    摘要:对象直接量的默认值表示能否通过循环返回属性。同样密封对象操作是不可逆的。代表未冻结已冻结属性特性规则总结如果对象是不可拓展的,则可以编辑已有的自有属性,但不能给它添加新属性。 写在前面 注:这个系列是本人对js知识的一些梳理,其中不少内容来自书籍:Javascript高级程序设计第三版和JavaScript权威指南第六版,感谢它们的作者和译者。有发现什么问题的,欢迎留言指出。 1.数据...

    13651657101 评论0 收藏0
  • 关于ES模块你必须要知道一些禁忌(一)

    摘要:没有模块化的支持,使用开发大型应用将举步维艰,所以经过大量的实践,社区制定了一些模块加载方案,最主要的有运行于浏览器的方案和运行于以为代表的服务端的方案。该方法返回被冻结的对象。 背景 ES Module是JavaScript在ES2015版本开始提供的语言标准级别的模块化方案,在此之前JavaScript一直没有语言级别的模块化体系。没有模块化的支持,使用JavaScript开发大型...

    yexiaobai 评论0 收藏0
  • js面试题(下)

    摘要:短路运算返回值是什么又称为短路或,短路如果左侧为真,则不再进行右侧运算,同时返回左侧表达式运算结果。上面是不存在的,所有结果为,转成就是,那么就会运算,把赋值给的同时,返回值也是,所以打印返回结果是函数内部变量有哪些 DOM元素e的e.getAttribute(propName)和e.propName有什么区别和联系 e.getAttribute(),是标准DOM操作文档元素属性的方...

    zhoutao 评论0 收藏0
  • JavaScript对象遍历

    摘要:简单说就是一个有一个函数,这个函数执行的返回值一定是一个对象,对象有两个属性标记迭代是否结束,标记这次迭代的结果值。 引言 遍历对象是平常工作中很常见的一个操作,几乎是日常操作,但是遍历对象真的是一件很容易的事情么,显然不是的。 常用的方式 for...in for (variable in object) {...} 这个是一个很常见的用法,相信每个人顺手都可以写出来。但是这里需要主...

    Seay 评论0 收藏0
  • JavaScript对象详解

    摘要:属性描述符升级打怪必备技能对象有自己的属性和方法,对于我们对象的属性来讲,属性还有自己的属性,又称为属性描述符。这个方法接受三个参数,第一个是指定的对象,第二个是指定的对象参数,第三个当然是要修改的属性描述符了。 对象的声明有俩种: 字面量 通过new一个构造函数Object 两者唯一的区别就是,字面量形式,可以一次赋值多个,通过new Object就得一个一个赋值 数据类型 ...

    fancyLuo 评论0 收藏0

发表评论

0条评论

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