js面向对象编程-三大特征

来源:互联网 发布:西翥灵仪 昆明知乎 编辑:程序博客网 时间:2024/05/15 02:04

1.抽象
在定义一个类的时候,实际上就是把一类事物的公有的属性和行为提取出来,形成一个物理模型(模板)。这种研究问题的方法称为抽象。

2.封装
封装就是把抽象出的属性和对属性的操作封装在一起,属性被保护在内部,程序的其他部分只有通过被授权的操作(函数),才能对属性进行操作。
js提供有以下几种控制方法和属性的访问权限:
(1)公开级别:对外公开
(2)私有级别:类本身可以访问,不对外公开

function Person(){    this.name=name; //公开属性    var age=agei;  //私有属性    var salary=sal;  //私有属性    //在类中如何定义公开方法(特权方法),私有方法(内部方法)     //如果我们希望操作私有的属性。则可用公开方法实现    this.show=function(){        window.alert(age+" "+salary);    }    //私有方法,可以访问对象的属性    function show2(){        window.alert(age+" "+salary);    }}var p1=new Person('sp',23,34);window.alert(p1.name);p1.show();   //正常输出//p1.show2();  //错误输出不能被定义

注意:前面学过通过prototype给所有对象添加方法,但是这种方式不能去访问类的私有变量和方法。
例如:

    function Person(){        this.name="abc";        var age=90;        this.abc=function(){            window.alert("abc()");        }        function abc2(){            window.alert("abc2");        }    }    Person.prototype.fun1=function(){        window.alert(this.name);  //正确        this.abc();   //正确        //abc2();  错误不能访问私有方法        //window.alert(age);  错误不能访问私有变量    }    var p1=new Person();    p1.fun1();

3.继承
(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(money){            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中实际上是通过对象冒充来实现继承,这句话不能少(因为js是动态语言,如果不执行这句话,那么不能实现继承效果)        //MidStu可以覆盖Stu父类的show称为重写        this.show=function(){            window.alert("MidStu show();");        }    }       function Pupil(name,age){        this.stu=Stu;        this.stu(name,age);    }    //测试    var midStu=new MidStu("abc",20);    midStu.show();//这里就会调用子类的show()

说明:通过对象冒充,js可以实现多重继承的效果,用得少。
(2)js的重载和重写
重载:方法重载就是类的同一种功能的多种实现方式,到底采用哪种方式,取决于调用者给出的参数。
js中不支持重载(即不可以通过参数的个数来决定调用哪个函数),但是因为js本身支持可变参数,所以可以看成天然支持重载。

function abc(){    if(argument.length=...){    }else if(){    }}

重写:子类可以重新写函数来覆盖父类的某些方法。

4.多态
多态就是指一个引用(类型)在不同情况下的多种状态。
js实际上是无态的,是一种动态语言,一个变量的类型是在运行的过程中由js引擎来决定的,所以说js天生就支持多态。

多态经典案例

    function Master(){        //给动物喂食        this.feed=function(animal,food){            document.writeln("主人给"+animal.name+"喂"+food.name);        }    }    //写食物类    function Food(name){        this.name=name;    }    function Fish(name){        this.food=Food;        this.food(name);    }       function Bone(name){        this.food=Food;        this.food(name);    }    //动物    function Animal(name){        this.name=name;    }    function Cat(name){        this.animal=Animal;        this.animal(name);    }    function Dog(name){        this.animal=Animal;        this.animal(name);    }    var cat=new Cat("小猫咪");    var fish=new Fish("小鱼");    var master=new Master();    master.feed(cat,fish);    master.feed(new Dog("小狗"),new Bone("骨头"));
原创粉丝点击