关于js中面向对象的理解要完成的学习类的继承、封装、多态封装将实现一个功能的代码封装成一个函数(在一个班级)。如果后面要实现这个功能,只需要执行这个功能方法即可,无需重复。编写代码。低耦合,高内聚减少页面中的冗余代码,提高代码复用率多态一个类(函数)的多种形式:重载,重写【重载】后台java,c#等编程语言,对于重载的概念:同一个方法不同参数的名称被调用的方法重载//=>CODE}sum(12,23)//firstsum(12)//secondsum(12,'word')//在第三个JS中和后台类似,没有严格意义上的重载。如果JS中方法名相同,那么最后只能保留JS中的一个重载(与实际参数无关):同一个方法,通过传递不同的参数(arguments)我们完成不同的功能,我们也可以理解为重载functionsum(num1,num2){returnnum1+num2;}functionsum(){varary=Array.prototype.slice.call(arguments)returneval(ary.join('+'));}sum(10,20)sum(10,20,30);//=>无论执行哪一次,不管后台语言还是js,都会重写第二个sum:子类重写父类的方法继承类什么的是继承?子类继承父类的一些属性和方法1.原型继承使得子类的原型指向父类的实例Children.prototype=newParent();functionParent(){this.x=10;}父母.原型。getX=function(){console.log(this.x)}functionChild(){this.y=20;}Child.prototype=newParent();//子类原型方法扩展前最好先执行Child.prototype.constructor=Child;Child.prototype.getY=function(){console.log(this.y);}varchild=newChild();console.log(child.y);child.getY();child.getX()console.log(child.x);[详情]1.我们首先让子类的原型指向父类的实例,然后将方法扩展到子类原型,防止提前添加方法。原型重新指向后,之前在子类原型上扩展的方法将失效(子类原型已经指向新的空间地址)2.让子类原型重新指向父类实例,而原来的子类原型上的构造函数将消失。为了保证构造函数的完整性,我们最好为子类原型重新设置构造函数属性值:子类,而是在子类的原型和父类的原型之间架起一座桥梁。以后子类或者子类的实例都可以通过原型链。查找机制在父类的原型上查找方法,从而调用和使用这些方法。[特点]子类不仅可以继承父类原型上的公共属性方法,还可以继承父类提供给实例的私有属性方法。被子类继承(保存在子类原型上,作为子类的公共属性和方法)2.调用在子类结构中继承,父类作为普通方法执行,这样父类方法中的this指向functionParent(){this.x=10;}Parent.prototype.getX=function(){console.log(this.x);}functionChildren(){//=>this:child的子类实例子类实例Parent.call(this);//让Parent执行,方法中的this仍然是子类中的一个实例(在父类结构中写this.xxx=xxx相当于给子类和方法的实例加上一些私有属性)this.y=20;}varchild=newChildren();console.log(child.x);【原理】将父类结构中的私有属性和方法原封不动的复制一份给子类的一个实例(继承完成后,子类与父类没有关系);公共的不能被继承。[详情]我们一般把调用继承放在子类结构体的第一行,也就是创建子类实例时,首先进来的是先继承,然后给实例赋自己的私有值(好处:self可以替换继承的结果——如果有重复的话)3.寄生组合继承Object.create:创建一个空对象,并以obj为新创建对象的原型。低版本不兼容varobj={name:'helloword'}varnewObj=Object.create(obj);newObj.__proto__===obj寄生组合继承完成父类public的子类public继承的需要(一个workaroundforprototypeinheritance)subclassprivateinheritanceParentclassprivate(调用继承完成)functionParent(){this.x=10;}Parent.prototype.getX=function(){console.log(this.x)}functionChildren(){Parent.call(this)this.y=20;}Children.prototype=Object.create(Parent.prototype);Children.prototype.constructor=Children;Children.getY=function(){console.log(this.y);}varchild=newChildren();console.log(child.x);child.getX()实现了类似Objcet.createObject.myCreate=functionmyCreate(obj){varFn=newFunction();Fn.prototype=obj;returnnewFn();}varoo={name:'o'}Object.myCreate(oo)4.ES6类和继承类classFn{constructor(a){//=>constructor:Fn//=>this.xxx=xxx这里是为当前实例设置的私有属性this.xxx=a}//=>这里设置的方法都放在Fn里面。在原型上(为实例提供的公共属性方法)//=>getX$setX:都是为Fn.prototype设置的方法getx(){}setX(){}//=>static这些属性和方法都是Fn使用的是普通对象设置的私有属性和方法,与实例无关staticprivate(){}}letf=newFn(10,20);继承类A{constructor(){this.x=10}getX(){console.log(this.x);}}B类扩展A{constructor(){super();//=>原理调用继承,第一句一定要写super()this.y=20;}getY(){console.log(this.y);}}让b=newB();5.forin循环遍历详解Object.prototype.hasPubProperty=functionhasPubProperty(){}/**forin循环不仅可以遍历当前对象(或当前实例)的所有私有属性和方法,还可以遍历公共属性自己在原型**for上创建的方法只会遍历私有属性和方法(索引较多),在原型上面扩展的方法不会被遍历**/varobj={name:'tom',age:8}for(constobjKeyinobj){//webstorm快捷键itinif(obj.hasOwnProperty(objKey)){console.log(objKey);}//console.log(objKey);//hasPubProperty}varary=[12,23,34];for(leti=0;i
