面向对象的概念:一种高级的编程思想,更加关注事物所涉及的对象。如何定义对象,给对象添加属性和方法才是最好的?定义对象以使用自定义构造函数:functionconstructorname(parameter,...){this.property=formalparameter}varobject=newconstructor(actualparameter,...)new时发生了什么?创建一个空对象并将this指向返回this对象的执行函数中的代码添加属性:使用构造函数调用的实参和形参,构造函数中的this代表新对象添加方法:将方法添加到原型中-Constructor.prototypePrototype:任何对象的固有属性__proto__对应的值都是对象-Prototype任何函数的固有属性prototype对应的值都是对象-原型原型的作用:原型上的属性和方法是默认的原型链可以被对象使用:对象必须有原型,原型也是对象,所以原型也有原型,...,这样形成的链式结构——原型链的作用原型链:当访问对象的属性和方法的时候,先自己找找,没有就去找原型,我如果原型上没有,请转到原型的原型。..直到顶层原型(Object对应的原型),如果没有顶层原型,返回undefined回流重绘浏览器的渲染过程:解析html结构形成DOM树,解析css为同时形成一棵CSS树,将两棵树合并成一棵渲染树。计算标签的大小和位置,为其着色,并在浏览器中显示。如果我们操作标签的大小和位置,我们需要重新计算大小和位置,然后绘制颜色,然后显示-造成回流/reflow如果我们改变标签的颜色,我们需要重新绘制颜色和显示-导致重绘回流和重绘都是性能的浪费。提高性能:合并样式修改①将label.style.csskey=value改为label.style.cssText='csskey:value;CSS键:值;'②通过操作标签的style属性完成样式③多种样式写入类名并进行类名操作节点操作①使用文档片段②隐藏标签=>操作=>显示③克隆标签=>操作=>替换原来的label,最小化定时器中节点的操作动画,将获取定时器中label大小和位置的操作放在定时器外。深克隆和浅克隆。对于引用数据类型,将数据复制到一个新数据类型。需要保证新数据不与原数据共用同一个数据地址。.浅克隆:只能克隆最外层的数据,里面的数据也会共享一个数据地址。深度克隆:外层数据和内层数据根本不共享地址。对象浅克隆:遍历原对象,将所有键值对放入新对象中使用Object.assign(newobject,originalobject)varnewobject={...Originalobject}数组浅克隆:遍历原数组并把所有数据放在新数组中,用Object.assign(newarray,originalarray)varnewarray={...Originalarray}用数组的slice方法截取从头到尾赋值给新阵列。使用数组的concat方法将原数组空合并(没有合并)形成一个新的数组。深度克隆:使用json数据转换:varnewdata=JSON.parse(JSON.stringify(originaldata))手写递归函数deepClone(data){if(Object.prototype.toString.call(data)==='[objectObject]'){varnewData={}}elseif(Object.prototype.toString.call(data)==='[objectArray]'){varnewData=[]}else{返回数据}for(varkeyindata){if(Object.prototype.toString.call(data[key])==='[objectObject]'||Object.prototype.toString.call(data[key])==='[objectArray]'){newData[key]=deepClone(data[key])}else{newData[key]=data[key}}returnnewData}
