记录我遇到的一些Javascript问题和解决思路

110 阅读1分钟

一、实现JS模拟手工点击事件

Event:事件 + dispatchEvent:派发事件

MDN介绍Event、

   var ev = new Event('click', { bubbles: false, cancelable: false });
   window.dispatchEvent(ev);
   
   // 事件可以在任何元素触发,不仅仅是document 
   myDiv.dispatchEvent(ev);

二、默认事件、阻止冒泡和阻止事件传播(后续添加描述)

1.默认事件
    event.preventDefault(); //默认事件
2.冒泡
    event.stopPropagation(); //冒泡
3.事件传播
    event.stopImmediatePropagation(); //捕获

三、克隆一个类的实例(尝试好像并没有Clone成功)

单行代码实现类的实例的克隆

 let clone = Object.assign( Object.create( Object.getPrototypeOf(orig)), orig)

它避免设置原型,因为他们说这会大大降低代码速度。

它支持符号,但不适用于getter / setter方法,并且不适用于不可枚举的属性(请参见Object.assign()docs)。此外,可悲的是,克隆基本内部类(例如Array,Date,RegExp,Map等)似乎经常需要一些单独的处理。

原文地址

四、Object 赋值和复制

          let obj = {
            name: '张三',
          };

          // -----------------------------JSON.parse-------------------------------------
          let a = JSON.parse(JSON.stringify(obj)); 
          console.log(a.name);  //--复制了数据

          // ------------------------------Object.getOwnPropertyDescriptors--------------
          let b = Object.getOwnPropertyDescriptors(obj) as { name: string };
          console.log((b.name = 'hhhh')); // --- 修改了原数据

          // ---------------------------------Object.assign------------------------------
          let clone = Object.assign(
            Object.create(Object.getPrototypeOf(obj)),
            obj
          );
          console.log((clone.name = '测试????')); // --- 修改了原数据

          // ----------------------------------Object.assign-----------------------------
          let x = {} as { name: string };
          Object.assign(x, obj);
          console.log(x.name); // --- 修改了原数据

          // ------------------------------for--in----------------------------------------

          let D = {} as { name: string };
          for (const key in obj) {
            D[key] = obj[key];
          }
          console.log(D);  //--复制了数据