js: 对象中整体属性的特性及克隆

本文介绍JavaScript中对象的三种保护方式:preventExtensions、seal和freeze,以及实现对象克隆的不同方法,包括浅克隆和深度克隆,探讨如何避免引用类型属性的共享问题。

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

对整个对象的设置:

Object.preventExtensions方法: 不可增加新属性。

        var obj = {
    x: 1,
    y: 2,
}
obj.a = 3;
Object.preventExtensions(obj);
obj.b = 4;

      

v2-e8523a00f8b22ee2c6fc6b388b7b9540_b.jpg

Object.seal方法: 不可增加新属性和不可设置特性。

        var obj = {
    x: 1,
    y: 2,
}
obj.a = 3;
Object.seal(obj);
Object.defineProperty(obj, "x", {
    writable: true,
    enumerable: false,
    configurable: true,
})

      

v2-41db8f5b9c4d2c9ce194259471cf6493_b.jpg

Object.freeze方法: 不可增加新属性、不可设置特性和不可修改属性值。

        var obj = {
            x: 1,
            y: 2,
        }
obj.a = 3;
Object.freeze(obj);
obj.x = 10;
obj.b = 20;

      

v2-e6b9f198ca09b8bc03ca2c9bfa538da6_b.jpg

查看特性的方法: 如果是则返回true, 不是则返回false。

Object.isExtensible;
Object.isSealed;
Object.isFrozen;

以上一段代码为列:

v2-d35a9e2ecab37faaf04cf76cbb075dd1_b.jpg

作用: 包含对象。


克隆对象:

浅克隆:

        // 最简单浅克隆
var obj = {
    x: 1,
    y: 2,
}
 
obj1 = {};
for(var i in obj) {
    obj1[i] = obj[i];
}

      

v2-d074de3a780ed209edfd7e3c0cfb6796_b.jpg

问题: 假设obj上的属性中有一个是对象,当在obj上修改了属性中对象的属性的值,克隆的obj1上的也会改变。

v2-f3cc7856308b9c6ce2ca314a5075f603_b.jpg

变成了指针的赋值。


深度克隆:

        var obj = {
    x: 1,
    y: {
          a: 10,
       }
 }
 
 obj1 = {};

function clone(obj) {
    var cloneobj = {};
    for(var i in obj) {
        if( typeof obj[i] == "object" ) {
            cloneobj[i] = clone(obj[i])
         }
         else cloneobj[i] = obj[i];
    }
    return cloneobj;
}

      

v2-dc7b339d83081413aac756e408816936_b.jpg
深克隆


原型克隆:

        var obj = {
    x: 1,
    y: {
           a: 10,
        }
}

function clone1(obj) {
    function Temp() {};        // 写一个构造函数
       Temp.prototype = obj;   // 让原型继承克隆的对象
       return new Temp();
    }

      

v2-46c58548c30b2e142eac0618c3e38cc8_b.jpg

虽然是实例,但是可以直接使用。



---------------------------------再修改一下深度克隆---------------------------

判断字符、数组、对象。

如果是字符、数字、布尔、函数直接return;如果是数组,需要遍历,如果数组中还有对象,那使用刚刚的方法。

        function clone(obj) {
    if(obj instanceof Array) {
        var ary = [];
        for(var i=0; i<obj.length; i++) {
            ary[i] = clone(obj[i]);
            // 这个也是使得递归到字符、数字、布尔、函数。
        }
        return ary;
    }
    if(obj instanceof Object) {
       var newObj = {};
       for(var key in obj) {
           console.log(typeof key)
           newObj[key] = clone(obj[key]);
           // 新对象应对的值要重新拿进来再判断一下,
           // 如果是值是字符,会直接return给值,如果是对象就再递归。
           }
       return obj
   }
   return obj
}

      

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值