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("骨头"));
阅读全文
0 0
- js面向对象编程-三大特征
- 面向对象编程的三大特征
- 面向对象编程的三大特征
- 面向对象编程三大特征
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- 面向对象三大特征
- js_day17--js面向对象三大特征+闭包
- js的面向对象的三大特征
- J2SE-4 面向对象编程之三大特征
- iOS 面向对象编程的三大特征
- 面向对象的三大特征
- Python3.6.3及Pycharm IDE安装教程
- Makefile文件
- [NOIP2017模拟]跑步
- L1-005. 考试座位号(输入问题)
- 51nod 1225 余数之和
- js面向对象编程-三大特征
- POJ 2419 Forests 笔记
- Linux 中几个高效过滤命令
- Kafka认识
- 时间复杂度
- java获取当前到0点的秒数
- 银行存款问题
- tp.3.2
- HDU-4372 Count the Buildings