Object.defineProperty(obj, prop, descriptor)
var obj = {};
Object.defineProperty(obj, "key", {
enumerable: false,
configurable: false,
writable: false,
value: "static"
});
- configurable(false): 当且仅当该属性的 configurable 键值为 true 时,该属性的描述符才能够被改变,同时该属性也能从对应的对象上被删除。
- enumerable(false): 当且仅当该属性的 enumerable 键值为 true 时,该属性才会出现在对象的枚举属性中。
- writable(false): 当且仅当该属性的 writable 键值为 true 时,属性的值,也就是上面的 value,才能被赋值运算符改变。
- value(undefined): 该属性对应的值。可以是任何有效的 JavaScript 值(数值,对象,函数等)。
- get(undefined): 属性的 getter 函数,如果没有 getter,则为 undefined。当访问该属性时,会调用此函数。执行时不传入任何参数,但是会传入 this 对象(由于继承关系,这里的this并不一定是定义该属性的对象)。该函数的返回值会被用作属性的值。
- set(undefined): 属性的 setter 函数,如果没有 setter,则为 undefined。当属性值被修改时,会调用此函数。该方法接受一个参数(也就是被赋予的新值),会传入赋值时的 this 对象。
Object.defineProperties(obj, prop)
var obj = {};
Object.defineProperties(obj, {
'property1': {
value: true,
writable: true
},
'property2': {
value: 'Hello',
writable: false
}
});
禁止属性扩展(Object.isExtensible && Object.preventExtensions)
1. Object.isExtensible()方法判断一个对象是否是可扩展的(是否可以在它上面添加新的属性)。
2. Object.preventExtensions()方法让一个对象变的不可扩展,也就是永远不能再添加新的属性,并且返回原对象。
var empty = { key: '123' };
Object.preventExtensions(empty);
Object.isExtensible(empty); // false
console.log(Object.getOwnPropertyDescriptor(empty, 'key')); // {value: "123", writable: true, enumerable: true, configurable: true}
密封对象(Object.isSealed && Object.seal)
1. Object.isSealed()方法判断一个对象是否是密封的。
2. Object.seal()方法可以让一个对象密封,并返回被密封后的对象。
var empty = { key: '123' };
Object.seal(empty);
Object.isSealed(empty); // true
console.log(Object.getOwnPropertyDescriptor(empty, 'key')); // {value: "123", writable: true, enumerable: true, configurable: false}
冻结对象(Object.isFrozen && Object.freeze)
1. Object.isFrozen()方法判断一个对象是否被冻结。
2. Object.freeze()方法可以冻结一个对象。
var empty = { key: '123' };
Object.freeze(empty);
Object.isFrozen(empty); // true
console.log(Object.getOwnPropertyDescriptor(empty, 'key')); // {value: "123", writable: false, enumerable: true, configurable: false}