js 之Object.freeze()以及其他的属性

本文介绍了JavaScript中的Object.freeze函数,该函数用于阻止修改现有对象的属性并禁止添加新属性。文章详细解释了函数的工作原理,包括如何使对象不可扩展、设置configurable特性为false以及设置writable特性为false。并通过示例代码展示了如何使用此函数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Object.freeze 函数 (JavaScript)

 

阻止修改现有属性的特性和值,并阻止添加新属性。

 

语法

JavaScript

Object.freeze(object)

 

参数

object

必需。在其上锁定特性的对象。

 

返回值

传递给函数的对象。

 

异常

如果 object 参数不是对象,则将引发 TypeError 异常。

ExceptionCondition

 

备注

Object.freeze 函数执行下面的操作:

  • 使对象不可扩展,这样便无法向其添加新属性。

  • 为对象的所有属性将 configurable 特性设置为 false。在 configurable 为 false 时,无法更改属性的特性且无法删除属性。

  • 为对象的所有数据属性将 writable 特性设置为 false。当 writable 为 false 时,无法更改数据属性值。

有关如何设置属性的特性的更多信息,请参见 Object.defineProperty 函数 (JavaScript)。若要获取属性的特性,可使用Object.getOwnPropertyDescriptor 函数 (JavaScript)

 

相关函数

以下相关函数可阻止修改对象的特性。

函数

对象已设置为不可扩展的

为每个属性将 configurable 设置为 false

为每个属性将 writable 设置为 false

Object.preventExtensions

Object.seal

Object.freeze

如果满足下表中标记的所有条件,则以下函数返回 true

函数

对象是否可扩展

为所有属性将 configurable 设置为 false

为所有数据属性将 writable 设置为 false

Object.isExtensible

Object.isSealed

Object.isFrozen

下面的示例阐释了 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 ) 
这里写图片描述

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风儿轻丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值