zoukankan      html  css  js  c++  java
  • 深克隆 闭包 面向对象总结

    <body>
       姓名:<span id="spanName"></span>
       <br>
       <input type="text" id="inpName">
       <script>
           let a = {},
               b = '0',
               c = 0 ;
          a[b] = 'lord';
          a[c] = 'suan';
          console.log(a[b]);    //'suan' 
    
          let a = {},
          b = Symbol('1'),
          c = Symbol('1');
          a[b] = 'lord';
          a[c] = 'suan';
          console.log(a[b]); //'lord'
    
          let a = {},
          b = {
             n : '1'
          },
          c = {
             m : '2'
          };
          a[b] = 'lord';
          a[c] = 'suan';
          console.log(a[b]);  //'suan'
    
          var test = (function(i){
              return function() {
                alert(i *= 2)
              }
          })(2);
          test(5);    //'4'
    
          var a = 0,
          b = 0;
          function A(a){
             A = function (b) {
                alert(a + b++);
             };
             alert(a++);
          }
          A(1);   //'1'
          A(2);   //'4'
    
          let obj = {
             a: 100,
             b :[10,20,30],
             c: {
                x:10
             },
             d : /^d+$/
          };
    
          浅克隆1    弊端:obj2数据更改之后    obj也更改了
          let obj2 = {};
          for(let key in obj) {     //hasOwnProperty过滤私有的
             if(!obj.hasOwnProperty(key))  break;
             obj2[key] = obj[key];
          }
          
           浅克隆1
           let obj2 = {...obj};
    
           深克隆   一般使用深克隆
           JSON.stringify(obj)  的时候,弊端:函数 时间 正则都会出现问题
           let obj2 = JSON.parse(JSON.stringify(obj));
           console.log(obj,obj2);
    
          深克隆de弊端怎么办  
          function deepClone(obj) {
              //过滤特殊情况
              if(obj === null)  return null;
              if(typeod obj !== "object")  return obj;
              if(obj instanceof RegExp) {   //正则
                    return new RegExp(obj);  
              }
              if(obj instanceof Date) {     //时间
                   return new Date(obj);
              }
    
              // 函数的办法   递归
              // 不直接创建对象目的,克隆的结果和之前保持相同的所属类
              let newObj = new obj.constructor;
              for (let key in obj) {
                  if(obj.hasOwnProperty(key)){
                        newObj[key] = deepClone(obj[key]);
                  }
              }
    
              return newObj;
          }
          let obj2 = deepClone(obj);
          console.log(obj,obj2);
          console.log(obj === obj2);
          console.log(obj.c === obj2.c);
          
         
         面向对象
          function Foo() {
             getName = function () {
                console.log(1);
             };
             return this;
          }
          Foo.getName = function () {
             console.log(2);
          }
          Foo.prototype.getName = function() {
             console.log(3);
          }
          var getName = function() {
             console.log(4);
          }
          function getName () {
             console.log(5);
          }
          Foo.getName();   //2
          getName();       //4
          Foo().getName(); // 1
          getName();    //1
          new Foo.getName();  //2
          new Foo().getName(); //3
          new new Foo().getName();//3
    
          
          同步异步
          async function async1() {
             console.log('async1 start');
             await async2();
             console.log('async1 end');
          }
    
          async function async2() {
             console.log('async2');
          }
    
          console.log('script start');
    
          setTimeout(function () {
             console.log('setTimeout'); 
          },0)
    
          async1();
    
          new Promise(function (resolve) {
             console.log('promise1');
             resolve();
          }).then(function() {
             console.log('promise2');
          });
    
          console.log('script end'); 
    
                script start
                async1 start
                async2
                promise1
                script end
                async1 end
                promise2
                setTimeout
    
    
          闭包
    
           vue双向数据绑定原理  2.0
           let obj = {
             name:''
           };
           let newObj = JSON.parse(JSON.stringify(obj));
           Object.defineProperty(obj,'name',{
             get() {
                return newObj.name;
             },
             set(val) {
                if(val === newObj.name) return;
                newObj.name = val;
                observer();
             }
             
           });
           function observer() {
             spanName.innerHTML = obj.name;
             inpName.value = obj.name;
           } 
           setTimeout(()=>{
             obj.name = 'lord';
           },1000) 
           inpName.oninput = function () {
             obj.name = this.value
           } 
    
           2.0问题 需要深克隆
           3.0
           let obj = {};
           obj = new Proxy(obj,{
             get (target,prop) {    //target指 obj  prop指obj里的属性  value指值
                return target[prop];
             },
             set(target,prop,value) {
                target[prop] = value;
                observer()
             }
           })
           function observer() {
             spanName.innerHTML = obj.name;
             inpName.value = obj.name;
           } 
           setTimeout(()=>{
             obj.name = 'lord';
           },1000) 
           inpName.oninput = function () {
             obj.name = this.value
           }
       </script>
    </body>
  • 相关阅读:
    inner join 与 left join 之间的区别
    从group by 展开去
    distinct的用法
    with as的用法
    substr函数的用法
    Oracle的dual表是个什么东东
    Sql函数笔记一、case when
    在本地没有安装Oracle的情况下,使用plsql远程连接数据库
    【Ubuntu】执行定时任务(cron)
    【系统】Ubuntu和win7双系统更改系统引导菜单
  • 原文地址:https://www.cnblogs.com/isuansuan/p/12837628.html
Copyright © 2011-2022 走看看