设置对象的不可拓展

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

Object.preventExtensions

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

1
2
3
4
5
6
7
8
9
10
11
12
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判断对象是否可拓展

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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 #<Object>

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

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

Object.freeze

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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值,来判断对象是否可拓展