obj的ES6的get&set方法以及数据劫持

1.

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>

<body>

    <script>

        /* es给对象提供了 set 和 get方法 可以对对象再进行操作 */

        let obj = {

            _name:'zhangsan',

            get name(){

                console.log('即将获取');

               return this._name

            },

            set name(v){

                if(v!==this._name){

                    console.log('即将设置');

                    this._name = v

                }


            }

        }

       /*  document.write(obj._name) */

       obj.name = 'lisi'

       document.write(obj.name)

    </script>

</body>

</html>

2.

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>

<body>

    <script>

        /* 不支持ie8及以下 */

       /*  Object.defineProperty() */

       let obj = {

           name:"zhangsan",

           age:30

       }

       /* Object.defineProperty 可以对对象的属性进行劫持 */

       /* configurable 属性是否能被删除和修改,默认为true 可以被删除修改 */

       /*

       value就是对象属性的默认值,优先级比定义的优先级大

       value:包含这个属性的数据值,默认值为undefined

       */

       Object.defineProperty(obj,'name',{

           /* 是否通过delete删除属性从而重新定义属性 */

           /* configurable:false */

           /* writable:表示能否修改属性的值,默认值为true为false则不能被修改,变成只读属性 */

           writable:false

       })

       /* delete obj.name */

       /* 只针对于删除 */

       obj.name = 'lisi'

       document.write(obj.name)

       // 可以对多个对象劫持

       // enumerable 表示能否通过for in 循环访问属性,,默认值为true

       /* Object.defineProperties(obj,{

           name:{

               enumerable:true

           },

           age:{

               enumerable:false

           }

       }) */

       for(var key in obj){

          document.write(obj[key]+'<br>')

       }

    </script>

</body>

</html>

3.

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>

<body>

    <script>

        let obj = {

            _name:'zhangsan',

        }

       /*  Object.defineProperty(obj,'name',{

            writable:false,

            get (){

                console.log('获取值');

                return this._name;

            },

            set (v){

                console.log('我设置的值');

                this._name = v

            }

        }) */

        Object.defineProperties(obj,{

            name:{

                configurable:false,

                 writable:false,

                 value:'gygygy'

               /*  get (){

                console.log('获取值');

                return this._name;

            },

            set (v){

                console.log('我设置的值');

                this._name = v

            } */

            }

        })

        document.write(obj.name)

        obj.name = 'wanger'

        document.write(obj.name)

        var params={

            _name:'wanger',

        }

        var p = {}

        /* 设置这个params的name 不能被删除

           给name设置get方法 返回 用户名:wanger

           给name设置set方法 设置的时候 可以把 p 对象添加一个属性name

            值就是你设置的值 */

            Object.defineProperties(params,{

            name:{

                configurable:false,

                get (){

                   return '用户名'+this._name;

            },

            set (v){

                p.name = v

            }

            }

        })

        document.write(params.name+'<br>')

        params.name = 'zhangsan'

        document.write(params.name+'<br>')

        document.write(p.name)

    </script>

</body>

</html>

4.

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">

    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <meta name="viewport" content="width=device-width, initial-scale=1.0">

    <title>Document</title>

</head>

<body>

    <script>

        let p = {

            name:'zhangsan',

            age:30

        }

        let p2 = {

            get(obj,key){

                console.log('我要获取 obj是'+obj+'key是'+key+'值是'+obj[key]);

                return obj[key]

            },

            set(obj,key,val){

                console.log('key是'+key+'值是'+obj[key]+'要修改为:'+val);

               obj[key] = val

            }

        }

        /* p 代表源对象 p2 代表需要操作的对象 */

        let proxy1 = new Proxy(p,p2);

        console.log(proxy1);

         /* 测试get是否能够成功拦截成功 */

        document.write(proxy1.name+'<br>')

        document.write(proxy1.age+'<br>')

        document.write(proxy1.ab+'<br>')

        /* 测试set是否能够拦截成功 */

         proxy1.name = 'xiaoming'

         document.write(proxy1.name+'<br>')

         /* 使用vue3的 proxy的方法 对 对象 let stu = {name:'adc',no:9823,sex:'男'}  

             进行数据劫持 获取stu.no返回并打印 adc的学号是9823

                         获取stu.sex返回并打印 adc的性别是男

                         设置stu 如果设置的sex是女 那么页面会打印abc 只能是男

                         还是默认是男    */

        let stu = {name:'adc',no:9823,sex:'男'}

        let stu2 = {

            get(obj,key){

              if(key=='no'){

                  return obj.name+'的学号是'+obj[key]

              }

              if(key=='sex'){

                  return obj.name+'的性别是'+obj[key]

              }


            },

            set(obj,key,val){

              if(val=='女'){

                    document.write(`${obj.name}的性别必须为${obj[key]}<br>`)

                }else{

                    return  obj[key] = val

                }

            }

        }


        let proxy11 = new Proxy(stu,stu2);


        document.write(proxy11.no+'<br>')

        document.write(proxy11.sex+'<br>')

       /*  document.write(proxy11.name+'的学号是'+proxy11.no+'<br>')

        document.write(proxy11.name+'的性别是'+proxy11.sex+'<br>') */

        proxy11.sex = '女'

        document.write(proxy11.sex+'<br>')

    </script>

</body>

</html>

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容