JS 13

1. *****ES5

  对对象的保护:

     对单个属性的保护:

         数据属性:

         访问器属性:

对对象的保护:

   问题: 属性可随时直接用=赋值任何值

            属性可随时被访问

            可随时添加和删除属性

            ——不严格!

   解决: 对对象提供保护:

  

   如何:

     1. 对对象的属性提供保护

         将对象的属性分两大类:

            1. 命名属性: 可随时通过.属性名方式访问的属性

                  又分为2类:

                     1. 数据属性: 实际存储属性值的属性

                         如何保护: 每个属性都包含四大特性:

                            {

                              value: 实际存储属性值,

                              writable: true/false, //是否可修改

                              enumerable: true/false,//是否可for in遍历

                                    //依然可用.访问到

                              configurable: true/false,

                                  //1. 是否可修改前两个特性

                                  //2. 是否可删除当前属性

                                  //一旦改为false,不可逆!

                             }

                        特殊: 如果要定义的属性不存在:

                           defineProperty会自动添加:

                               自动添加后,属性的特性值都为false

                        问题: 只能提供基本(只读,遍历,删除)保护

                                无法按照自定义规则保护属性

                        解决:

                     2. 访问器属性: 不实际存储属性值

                                            专门对其它属性提供验证保护

                         何时: 只要按照自定义规则保护属性

                         如何: 也有四大特性:

                            {

                       get:function(){return 受保护的属性值},

                               set:function(val){

                                   验证要赋的新值val

                                   验证通过才将val保存到受保护的属性中

                               },

                               enumerable:true/false,

                               configurable:true/false,

                            }

                         当通过访问器属性获取受保护的属性值时

                                自动调用get方法

                         当通过访问器属性为受保护的属性赋值时

                                自动调用set方法

                                    参数val,自动获得要赋的新值

                         大问题: 受保护的属性值应该保存在哪儿?

                                      才能做到比人不能直接用,只能通过访问器属性访问

                         解决: 闭包!

            2. 内部属性: 无法通过.属性名方式访问到的属性

                  class    Object.prototype.toString.call(obj)

                  __proto__  Object.getPrototypeOf(obj)

                                    Object.setPrototypeOf(child,father)

     2. 对整个对象提供保护

1. *****ES5

  对对象的保护:

    对属性的保护

    防篡改

  Object.create();

  数组API:

*****bind()

1. 对对象的保护:

   对属性:

     命名属性

        数据属性:

        访问器属性:

           大问题: 受保护的属性值应该保存在?

           解决: 闭包

     内部属性

   防篡改: 禁止修改对象的属性结构

     3个级别:

     1. 防扩展: 禁止向对象中添加新属性

         Object.preventExtensions(obj)

     2. 密封: 即防扩展,又禁止删除旧属性

         Object.seal(obj)

            其实是将所有属性的configurable设置为false

     3. 冻结: 即密封,又禁止修改所有属性值!

          何时: 如果一个对象中保存了大量不变的属性值时

             Object.freeze(obj);

             其实是将所有属性的writable设置为false!

2. Object.create():

   var newObj=Object.create(father,{扩展的新属性})

    创建一个新对象newObj,继承father,并为newObj扩展新的自有属性

   何时: 只要继承一个现有对象,创建一个新的子对象时

   相当于: var newObj={};

               newObj.__proto__=father;

               Object.defineProperties(newObj,{

          扩展的新属性

               })

3. 数组API:

   1. 判断: 数组中的元素是否符合要求

      1. 所有元素是否都符合要求

          var bool=

         arr.every(function(val,i,arr){ return 判断条件 })              2. 是否包含符合要求的元素

          var bool=

               arr.some(function(val,i,arr){ return 判断条件 })

   2. 遍历API: 依次对数组中每个元素执行相同的操作

      1. 对原数组中每个元素执行相同的操作,结果保存回原数组

        arr.forEach(function(val,i,arr){  arr[i]=新值;  });

      2. 取出原数组中每个元素的值,执行相同的操作后,保存到一个新数组中

        var newArr=arr.map(function(val,i,arr){ 

            return 操作后的元素值

        });

   3. 过滤和汇总:

       过滤: 选择原数组中符合条件的元素,组成新数组

       var subArr=arr.filter(function(val,i,arr){

          return 判断条件;

       });

       汇总: 将原数组中每个元素统计出一个汇总结果

         var r=arr.reduce(function(prev,val,i,arr){

             return prev+val;

         },0);

         其中: 0: 表示初始值

                  prev: 截止到目前的阶段汇总值

                  回调函数的返回值,自动作为下次的prev值

原文地址:https://www.cnblogs.com/Hale-Proh/p/7199665.html