Object.freeze 函数 (JavaScript)
阻止修改现有属性的特性和值,并阻止添加新属性。
语法
JavaScript
Object.freeze(object)
参数
object
必需。在其上锁定特性的对象。
返回值
传递给函数的对象。
异常
如果 object 参数不是对象,则将引发 TypeError 异常。
Exception | Condition |
---|
备注
Object.freeze 函数执行下面的操作:
-
使对象不可扩展,这样便无法向其添加新属性。
-
为对象的所有属性将 configurable 特性设置为 false。在 configurable 为 false 时,无法更改属性的特性且无法删除属性。
-
为对象的所有数据属性将 writable 特性设置为 false。当 writable 为 false 时,无法更改数据属性值。
有关如何设置属性的特性的更多信息,请参见 Object.defineProperty 函数 (JavaScript)。若要获取属性的特性,可使用Object.getOwnPropertyDescriptor 函数 (JavaScript)。
相关函数
以下相关函数可阻止修改对象的特性。
函数 | 对象已设置为不可扩展的 | 为每个属性将 configurable 设置为 false | 为每个属性将 writable 设置为 false |
---|---|---|---|
是 | 否 | 否 | |
是 | 是 | 否 | |
Object.freeze | 是 | 是 | 是 |
如果满足下表中标记的所有条件,则以下函数返回 true。
函数 | 对象是否可扩展 | 为所有属性将 configurable 设置为 false | 为所有数据属性将 writable 设置为 false |
---|---|---|---|
是 | 否 | 否 | |
否 | 是 | 是 | |
否 | 是 | 是 |
下面的示例阐释了 Object.freeze 函数的用法。
JavaScript
// Create an object that has two properties. var obj = { pasta: "spaghetti", length: 10 }; // Freeze the object. Object.freeze(obj); // Try to add a new property, and then verify that it is not added. obj.newProp = 50; document.write(obj.newProp); document.write("<br/>"); // Try to delete a property, and then verify that it is still present. delete obj.length; document.write(obj.length); document.write("<br/>"); // Try to change a property value, and then verify that it is not changed. obj.pasta = "linguini"; document.write(obj.pasta); // Output: // undefined // 10 // spaghetti
要求
在以下文档模式中受支持:Internet Explorer 9 标准模式、Internet Explorer 10 标准模式和 Internet Explorer 11 标准模式。此外,也在应用商店应用(Windows 8 和 Windows Phone 8.1)中受支持。请参阅版本信息。
在以下文档模式中不受支持:Quirks、Internet Explorer 6 标准模式、Internet Explorer 7 标准模式、Internet Explorer 8 标准模式。
请参阅
Object.preventExtensions 函数 (JavaScript)
Object.seal 函数 (JavaScript)
Object.isExtensible 函数 (JavaScript)
Object.isSealed 函数 (JavaScript)
Object.isFrozen 函数 (JavaScript)
以下内容摘自其它博客:
对象的数据属性
Configurable,Enumerable,Writable,Value
var person = {}
Object.defineProperty(person,'name',{
configurable:false,//能否使用delete、能否需改属性特性、或能否修改访问器属性、,false为不可重新定义,默认值为true
enumerable:false,//对象属性是否可通过for-in循环,flase为不可循环,默认值为true
writable:false,//对象属性是否可修改,flase为不可修改,默认值为true
value:'xiaoming' //对象属性的默认值,默认值为undefined
});
//value
console.log(person);//xiaoming,默认value
//writable
person.name="qiang";
console.log(person);//xiaoming,不可修改value
//enumerable
for(var i in person){
console.log(person[i]) //无结果,不可循环
}
//configurable
delete person.name
console.log(person.name)//xiaoming,不可删除
Object.defineProperty(person,'name',{
configurable:true //不可修改,将抛出错误
});
访问器属性
getter,setter
var book = {
_year: 2004,//属性前面加_,代表属性只能通过对象方法访问
edition: 0
}
Object.defineProperty(book,'year',{
get: function(){
return this._year;
},
set: function(newValue){
if(newValue > 2004){
this._year = newValue;
this.edition += newValue - 2004
}
}
});
console.log(book.year)//2004
book.year = 2006;
console.log(book.year)//2006
console.log(book.edition)//2
定义多个属性
Object.defineProperties
var book = {};
Object.defineProperties(book, {
_year: {
value:2004,
writable:true
},
edition: {
value: 0,
writable:true
},
year: {
get: function() {
return this._year;
},
set: function(newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004
}
}
}
});
console.log(book.year) //2004
book.year = 2006;
console.log(book.year) //2006
console.log(book.edition) //2
读取属性
var book = {};
Object.defineProperties(book, {
_year: {
value:2004,
writable:true
},
edition: {
value: 0,
writable:true
},
year: {
get: function() {
return this._year;
},
set: function(newValue) {
if (newValue > 2004) {
this._year = newValue;
this.edition += newValue - 2004
}
}
}
});
console.log(book.year) //2004
book.year = 2006;
console.log(book.year) //2006
console.log(book.edition) //2
//读取属性
var descriptor__year = Object.getOwnPropertyDescriptor(book,'_year');
var descriptor_year = Object.getOwnPropertyDescriptor(book,'year');
console.log(descriptor__year )
console.log(descriptor_year )