①抽象java
js提供如下几种控制方法和属性的访问权限:函数
(1)公开级别:对外公开学习
(2)私有级别:类自己能够访问,不对外公开this
案例以下所示:spa
function Person(name,age,sal){ this.name=name;//公开的属性 var age=age;//私有属性 var salary=sal;//私有属性 //在类中如何定义公开方法(特权方法),私有方法(内部方法) //若是咱们但愿操做私有的属性,则可以使用公开方法实现 this.show=function(){ window.alert(age+" "+salary); } show2=function(){ window.alert(age+" "+salary); } } var p1=new Person("sp",20,50000); window.alert(p1.name+" "+p1.age); p1.show(); //p1.show2();//报错,由于show2是私有方法。
输出:sp undefinedprototype
20 50000code
☞咱们前面学习过,经过prototype给全部的对象添加方法,可是这种方式不能去访问类的私有变量和方法。对象
function Person(){ this.name="abc"; var age=90; this.abc=function(){ window.alert("abc"); } abc2=function(){ window.alert("abc"); } } Person.prototype.fun1=function(){ window.alert(this.name); //window.alert(age);//这会报错,由于prototype添加的方法不能访问类的私有属性和方法。 this.abc();//必须用this.abc(),若是用abc()会报错 //this.abc2();//报错,可是若是直接用abc2()又没有出问题 } var p=new Person(); p.fun1();
②继承blog
(1)为何须要继承?防止代码冗余,方便代码的管理继承
/*function MidStu(name,age){ this.name=name; this.age=age; this.show=function(){ window.alert(this.name+" "+this.age); } //计算学费 this.payFee=function(money){ window.alert("应缴"+money*0.8); } } function Pupil(name,age){ this.name=name; this.age=age; this.show=function(){ window.alert(this.name+" "+this.age); } this.payFee=function(){ window.alert("应缴"+money*0.5); } } */ //解决解决代码冗余-->继承 //抽象出一个学生类,(即把中学生和小学生的共性提取出来) function Stu(name,age){ this.name=name; this.age=age; this.show=function(){ window.alert(this.name+" "+this.age); } } function MidStu(name,age){ this.stu=Stu; this.stu(name,age);//js中其实是经过对象冒充,来实现继承,这句话不能少 } function Pupil(name,age){ this.stu=Stu; this.stu(name,age); } var midStu=new MidStu("顺平",20); midStu.show();
this.stu=Stu;后的this.stu(name,age)这句话是不能少的。
//抽象出一个学生类,(即把中学生和小学生的共性提取出来) function Stu(name,age){ this.name=name; this.age=age; this.show=function(){ window.alert(this.name+" "+this.age); } } function MidStu(name,age){ this.stu=Stu;//至关于把函数赋值给stu,赋值之后,必定要执行stu //this.stu(name,age);//js中其实是经过对象冒充,来实现继承,这句话不能少
//由于js是动态语言,若是不执行该语句,则不能实现继承效果。
} function Pupil(name,age){ this.stu=Stu; this.stu(name,age); } var midStu=new MidStu("顺平",20); window.alert(midStu.name);//没有this.stu(name,age);这句话,打印出undefined //midStu.show();//没有this.stu(name,age);这句话会报错,没有执行Stu函数
js能够不能够继承
没有extends关键字,可是能够经过对象冒充的方式实现继承,并且是多重继承。
特别说明:经过对象冒充,js能够实现多重继承的效果。
js不支持重载,可是函数的调用又和参数类型和参数个数是没有关系(其实也是另外一种形式的重载,只是否是经过函数名来实现的)。
js的重载和重写
重载:js中不支持重载(即,不能够经过参数的个数 来决定调用哪一个函数,可是由于js天热支持可变参数,因此,能够看作天热支持重载)。
结论:js只是不能够写几个同名函数(会被最后一个覆盖),可是由于函数调用时和参数没有关系,因此它具备函数重载所实现的功能。
重写:子类能够从新写函数,来覆盖父类的某个方法。
function Stu(name,age){ this.name=name; this.age=age; this.show=function(){ window.alert(this.name+" "+this.age); } } function MidStu(name,age){ this.stu=Stu; this.stu(name,age);//js中其实是经过对象冒充,来实现继承,这句话不能少 //MidStu能够覆盖Stu父类的show this.show=function(){ window.alert("MidStu show()"); } }
var midStu=new MidStu("顺平",20);
midStu.show();
重写,覆盖父类的方法。
③多态
所谓多态,就是指一个引用(类型)在不一样状况下的多种状态。在java中多态是指经过指向父类的引用,来调用在不一样子类中实现的方法。
js其实是无态的,是一种动态语言,一个变量的类型是在运行的过程当中由js引擎来决定的,因此说js天生就支持多态。
②封装