Javascript对象修改保护 扩展(Object.preventExtensions) 密封(Object.seal)和冻结(Object.freeze)

649 2 年前
JavaScript默认情况下,你可修改任何可以访问到的对象。但在多人协作开发的项目中,这会造成很大问题。如果你是一个模块或代码库的作者,你可能想锁定一些核心库的某些部分,保证任何人不能有意或无意的修改它们。

JavaScript默认情况下,你可修改任何可以访问到的对象。但在多人协作开发的项目中,这会造成很大问题。如果你是一个模块或代码库的作者,你可能想锁定一些核心库的某些部分,保证任何人不能有意或无意的修改它们。ECMAScript 5引入了几个方法来防止对对象的修改。

防止扩展,禁止为对象添加属性和方法,但已存在的属性和方法是可以被修改和删除的。不可增加, 可修改 可删除

密封,防止扩展,但禁止删除对象已存在的属性和方法。不可增加,可修改 不可删除

冻结,禁止修改对象已存在的属性和方法,所有字段都是只读的。不可增加,不可修改 不可删除

防止扩展用Object.preventExtensions()Object.isExtensible()方法用来检测对象是否是可扩展的。

判断一个对象是否可扩展,即是否可以给它添加新属性

var Person = {
  name: 'liuht'
}
//防止扩展
Object.preventExtensions(Person);
console.log(Object.isExtensible(Person)); //false
Person.sex = 1; //严格模式下抛出异常,正常模式下失败无提示

密封对象用Object.seal()Object.isSealed()方法用来检测对象是否是密封的。

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

    var Person = {
        name: 'liuht'
    }

    //密封
    Object.seal(Person);
    console.log(Object.isSealed(Person));// -> true
    console.log(Object.isExtensible(Person)); //-> false
    delete Person.name; //严格模式下抛出异常,正常模式下安静的失败
    Person.name = 10;//严格模式下抛出异常,正常模式下安静的失败
    console.log(Person.name) //10

冻结对象用Object.freeze()方法,Object.isFrozen()方法用来检测对象是否是冻结的。 这个方法比 Object.seal 更绝,冻结对象是指那些不能添加新的属性,不能修改已有属性的值,不能删除已有属性,以及不能修改已有属性的可枚举性、可配置性、可写性的对象。也就是说,这个对象永远是不可变的。

var Person = {
  name: 'liuht'
}

//冻结对象
Object.freeze(Person);
console.log(Object.isFrozen(Person)); // -> true
console.log(Object.isSealed(Person)); // -> true
console.log(Object.isExtensible(Person)); //-> false
delete Person.name; //严格模式下抛出异常,正常模式下安静的失败
Person.age = 10; //严格模式下抛出异常,正常模式下安静的失败
Person.name = 'new name'; //严格模式下抛出异常,正常模式下安静的失败
分类栏目
© 2018邮箱:11407215#qq.comGitHub沪ICP备12039518号-6