1/28 对于Vue.js 中 Object.freeze( )的理解

开门见山先总结,如有错误,大佬请指正

1. const  用于单一的变量上,对于对象的属性,const 不能做到 阻止 添加、修改 对象属性

2. freeze 只要是 对象 都可以 阻止 其发生改变 ( 弥补了 const 的不足,即 不能阻止 添加 修改属性)

3. Vue 是响应式的,所以对于 data 是无法 freeze 的

  ( /* 上面的说法可能有问题 */ 一般的做法是 var 一个对象, 对该对象进行 freeze 然后data中赋值 ) 

4.     var a = 123

  data :  { a : a }

  当  a : a 的第二个 a 即, 全局变量中的 a 发生改变时, data 中的 a 是不会发生改变的

    ( 注意 ,这个是一个特别基础但是深度思考但是又很难的问题 )

其实第34点很重要,我因为这个东西 卡了一下午的时间,以为freeze出问题了


1.const

  如果是单一的变量,会报错

  

   

  

  但是如果是对象,const 就不能组织对象属性的改变

  

   

 2&3&4 对于在Vue中的 freeze

  首先,我们原来犯了一个惯性思维错误,我一直以为freeze是作用于data里面的,但是并不是‘

  虽然data里面也是一个对象,但是 对于data的改变 freeze 是无法阻止 

  所以 这里我们得曲线救国一下

  先定义一个对象 var a = { x : xxx } ,对于这个对象 a 进行  freeze ,即Object.freeze( a )

  然后,对于data 里面的数据

  有 data : { a :a }

  当想对data 里面 a 操作时 转变为 对 全局变量  a  对象的操作 ( 一般都是通过methods 的方法进行 a  的修改 ,而且 不能修改 this.a  ) 

  ok,这样以后,会发现这个问题 全局变量 a 变了 ,但是 data 中的 a 却没有发生改变

  如果牵涉到 updated 生命周期函数,可以发现 没有任何输出

  由于实在是太难解释了,我把想说的都写进了代码里面,注释得比较详细,可以通过F12魔法来调试,看控制台的信息

  

 1 <!DOCTYPE html>
 2 <html lang="zh-CN">
 3 
 4 <head>
 5     <meta charset="UTF-8">
 6     <title>1.28</title>
 7     <script src="../vue.js"></script>
 8     <!-- 可以直接替换成下面的链接联网使用 -->
 9     <!-- <script src="https://cn.vuejs.org/js/vue.js"></script> -->
10 </head>
11 
12 <body>
13     <div id="app">
14         <!-- 测试message  普通变量 非对象的时候 -->
15         <div>message : {{message}}</div>
16         <br>
17         <!-- 这个是改变data 中 message 的内容 data message 会发生改变 -->
18         <!-- 注 .lazy 就是失去焦点后才开始改变数据 -->
19         <input v-model.lazy="message">
20         <!-- 这个是通过函数来改变 全局变量 message  
21             结果是全局变量message变化 但是data中的message不会变-->
22         <button @click ="changeMessage">改变message</button>  
23         <br>
24         <u>______________________________________________________</u>
25 
26         <!-- 测试text  对象 -->
27         <div>text : {{text}}</div>
28         <br>
29         <!-- 这两个按钮改的其实都是data里面的数据,没有改变 已经被冻住的( freezed )全局变量中的 obj -->
30         <!-- 这个是测试 freeze 的效果-->
31         <button @click ="changeText">1 改变text</button>
32         <!-- 直接对于data 中的 text 改变 -->
33         <button @click ="text = 'this text has changed'">2 改变text</button>
34     
35     </div>
36 </body>
37 
38     <script>
39         var obj =  { 
40              text: 'this message cant be changed.'
41              }
42         var message = 'this was the message.' 
43 
44         Object.freeze(message)  // message 不是对象 这个语句没什么卵用
45         Object.freeze(obj)
46 
47         var vm = new Vue({
48            el:'#app',
49            data(){
50                return{
51                      message: message,
52                      text : obj.text,
53                }},
54            methods:{
55                changeMessage(){
56                     message = "message has changed",
57                     // this.message = message,
58                     console.group("changeMessage")
59                     console.log( "data中的message数据 : " + this.message +'  ' +"全局变量中的messsag: "+ message)
60                     console.groupEnd()
61                },
62                changeText(){
63                    obj.text = "text has changed",
64                    this.text = obj.text, // 加了着句话,也不会引起 data 中的 text 改变
65                    console.group("chanegText")
66                    console.log( "data中的text数据 : " +this.text +'  ' +"全局变量中: "+ obj.text)
67                    console.groupEnd()
68                }
69            },
70         //    为了测试 data 对象是否也会被freeze 事实证明不会被freeze
71            created () {
72                 Object.freeze(this.data)
73            } ,
74            
75         //    对于data 中的数据进行改变的话, 就会执行下面的函数 updated 生命周期函数
76            updated() {
77             console.group("updated( 当data 中数据发生改变时 )");
78                 console.log( message === 'this was the message.'? '全局变量message没有改变' : "全局变量message改变"),
79                 console.log(obj.text === 'this message cant be changed.' ? '全局变量text没有改变' : "全局变量text改变")
80             console.groupEnd()
81 
82            }
83             
84         })
85     </script>
86 
87 </html>

  其实总的来说,就是

    1. 在beforeCreate 后 created 前, 全局变量中的数据就一次地给了 data 中的数据 , data 中的初始化数据就确定下来,以后只有对data中的数据改变,才能引起页面的改变,而之后对于全局变量中的改变,已经不能改变data了

    2. freeze 对于 data 是没有效果的。data 可以变 ( created 函数加了freeze 发现没有效果 ),freeze 只有对全局变量 对象,才有效 ( 注意 data 中的 64行 理解一下 )

  

总结

  其实 今天的内容显得有点幼稚, 我觉得应该是惯性思维惹出来的祸

  大佬请指正

Let it roll
原文地址:https://www.cnblogs.com/WaterMealone/p/14341809.html