可变对象
我们知道,JavaScript中对象是弱类型的。一般情况下,可以不受限制的为对象添加属性,修改属性,删除属性。大部分情况下,我们使用的都是可变对象。
不可变对象
对应的,我们不希望代码中某些对象被任意修改,比如添加、修改、删除等。这就是我们的不可变对象。JavaScript为我们提供了一些原生方法,借助它们可以讲一些可变对象转变成不可变对象。一共有三种:不可扩展,密封,冻结。
不可扩展
如果一个对象可以添加新的属性,则这个对象是可扩展的。相反,不可以添加新属性时就是不可扩展对象。我们可以使用 preventExtensions 让这个对象变的不可扩展。当对象不可扩展时,添加属性将静默失败或者 TypeError(严格模式下)。
function Person(name) {
this.name = name;
}
var kaka = new Person('kaka')
Object.preventExtensions(kaka);
kaka.secondName = 'zhang';
// 非严格模式下,静默失败
// 'use strict' 下 TypeError: Can't add property secondName, object is not extensible
检测
JS 提供了 Object.isExtensible 方法帮我们检测对象是否可扩展。
Object.isExtensible(kaka) // false, kaka为不可扩展对象