• 自己封装一个Object.freeze()方法


    1、遍历所有属性和方法

    2、修改遍历到的属性的描述

    3、Object.seal()

    Object.defineProperty(Object,'freezePolyfill',{
                    value:function(obj){
                        var i;
                        //遍历属性和方法
                        for(i in obj){
                            if(obj.hasOwnProperty(i)){
                                Object.defineProperty(obj,i,{
                                    //修改遍历到的属性
                                    writable:false
                                });
                            }
                        }
                        Object.seal(obj);
                    }
                });

    如果对象的其中一个属性又是对象,那么这个对象中的对象里的属性是可以被修改的。可以使用递归判断外层对象的属性是否为对象,再重新使用freezePolyfill()方法去套。(不使用递归而使用迭代的方式也可以):

                Object.defineProperty(Object,'freezePolyfill',{
                    value:function(obj){
                        var i;
                        for(i in obj){
                            if(obj.hasOwnProperty(i)){
                                //判断属性是否为对象
                                if(typeof(obj[i]) === 'object'){
                                    //迭代freezePolyfill方法
                                    Object.freezePolyfill(obj[i]);
                                }else{
                                    Object.defineProperty(obj,i,{
                                        writable:false
                                    });
                                }
                            }
                        }
                        Object.seal(obj);
                    }
                });

    应用:

    const xiaoming = {
                    age:14,
                    name:'小明',
                    obj:{
                        a:1
                    }
                };
                Object.freezePolyfill(xiaoming);
                

    总结:

    Object.defineProperty(obj,name,value)这个方法可以往一个对象上添加一个属性。第一个参数为对象名,第二个参数为属性名,第三个参数为属性值及描述。

    Object.seal(变量名)方法可以阻止对象被扩展,但是无法阻止对象被修改。可以使用defineProperty()将对象属性设置为只读。

    上述两个方法结合起来可以简单的达到一个Ojbect.freeze()的效果。

    语法

    Object.defineProperty(obj, prop, descriptor)

    参数

    obj
    要在其上定义属性的对象。
    prop
    要定义或修改的属性的名称。
    descriptor
    将被定义或修改的属性描述符。
  • 相关阅读:
    RHCE
    Linux firewalld 防火墙
    ArcGIS案例学习笔记2_2
    HP LaserJet MFP M227_M231双面打印
    罗伯特•盖洛博士(Dr. Robert Charles Gallo)是世界著名的美国生物医学家,他以共同发现了人类免疫缺陷病毒(HIV)――这一导致获得性免疫缺陷综合症(AIDS)的致病源而闻名于世。
    砸向芯片科研的巨额经费去了哪儿?(转)
    tensorflow学习资料
    必备 .NET
    c# 7 vs2017 tuple
    ArcGIS 复制要素
  • 原文地址:https://www.cnblogs.com/rickdiculous/p/12240764.html
Copyright © 2020-2023  润新知