JavaScript面向对象的三大特性
1、JavaScript面向对象的三大特性
JavaScript的三大特性:封装性、继承性、多态性。
2、JavaScript实现封装特性
在一些静态类型的语言如java中,本身语法就提供了这些功能。js当中只能依靠变量的作用域来实现封装的特性,并且只能模拟出public和private两种特性。封装实现就是是对象内部的变化对外界是透明的,不可见。这种做法使对象之间低耦合,便于维护升级,团队协作开发。
3、JavaScript实现继承特性
继承可以解决代码复用,让编程更加靠近人类思维。当多个类存在相同的属性(变量)和方法时,可以从这些类中抽象出父类,在父类中定义这些相同的属性和方法,所有的子类不需要重新定义这些属性和方法,只需要通过继承父类中的属性和方法。
JS中实现继承的方式:
1、通过call或者apply实现继承
- //1.把子类中共有的属性和方法抽取出,定义一个父类Stu
- function Stu(name,age){
- //window.alert("确实被调用.");
- this.name=name;
- this.age=age;
- this.show=function(){
- window.alert(this.name+"年龄是="+this.age);
- }
- }
- //2.通过call或者apply来继承父类的属性的方法
- function MidStu(name,age){
- //这里这样理解: 通过call修改了Stu构造函数的this指向,
- //让它指向了调用者本身.
- Stu.call(this,name,age);
- //如果用apply实现,则可以
- //Stu.apply(this,[name,age]); //说明传入的参数是 数组方式
- //可以写MidStu自己的方法.
- this.pay=function(fee){
- window.alert("你的学费是"+fee*0.8);
- }
- }
- function Pupil(name,age){
- Stu.call(this,name,age);//当我们创建Pupil对象实例,Stu的构造函数会被执行,当执行后,我们Pupil对象就获取从 Stu封装的属性和方法
- //可以写Pupil自己的方法.
- this.pay=function(fee){
- window.alert("你的学费是"+fee*0.5);
- }
- }
- //测试
- var midstu=new MidStu("zs",15);
- var pupil=new Pupil("ls",12);
- midstu.show();
- midstu.pay(100);
- pupil.show();
- pupil.pay(100);
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- <script type="text/javascript">
- function Animal(name,age){
- this.name=name;
- this.age=age;
- this.shout=function(){
- alert("我是:"+this.name+",今年:"+this.age);
- };
- this.action=function(){
- alert("会吃");
- };
- }
- function Dog(name,age){
- Animal.apply(this, [name,age]);
- }
- var jack=new Dog("jack",1);
- alert(jack.name);
- alert(jack.age);
- jack.shout();
- jack.action();
- </script>
- </body>
- </html>
2、原型继承方式实现继承
原型继承是js中最通用的继承方式,不用实例化对象,通过直接定义对象,并被其他对象引用,这样形成的一种继承关系,其中引用对象被称为原型对象。
- function A(){
- this.color = 'red';
- }
- function B(){}
- function C(){}
- B.prototype = new A();
- C.prototype = new B();
- // 测试原型继承
- var c = new C();
- console.log(c.color); // red
原型继承显得很简单,不需要每次构造都调用父类的构造函数,也不需要通过复制属性的方式就能快速实现继承。但它也存在一些缺点:
③ 占用内存多,每次继承都需要实例化一个父类,这样会存在内存占用过多的问题。
4、JavaScript实现多态特性
JS的函数重载
这个是多态的基础,JS函数不支持多态,事实上JS函数是无态的,支持任意长度,类型的参数列表。如果同时定义了多个同名函数,则以最后一个函数为准。
1、js不支持重载,通过判断参数的个数来模拟重载的功能。
- /*****************说明js不支持重载*****/
- function Person(){
- this.test1=function (a,b){
- window.alert('function (a,b)');
- }
- this.test1=function (a){
- window.alert('function (a)');
- }
- }
- var p1=new Person();
- //js中不支持重载.
- //但是这不会报错,js会默认是最后同名一个函数,可以看做是后面的把前面的覆盖了。
- p1.test1("a","b");
- p1.test1("a");
- //js怎么实现重载.通过判断参数的个数来实现重载
- function Person(){
- this.test1=function (){
- if(arguments.length==1){
- this.show1(arguments[0]);
- }else if(arguments.length==2){
- this.show2(arguments[0],arguments[1]);
- }else if(arguments.length==3){
- this.show3(arguments[0],arguments[1],arguments[2]);
- }
- }
- this.show1=function(a){
- window.alert("show1()被调用"+a);
- }
- this.show2=function(a,b){
- window.alert("show2()被调用"+"--"+a+"--"+b);
- }
- function show3(a,b,c){
- window.alert("show3()被调用");
- }
- }
- var p1=new Person();
- //js中不支持重载.
- p1.test1("a","b");
- p1.test1("a");
2、多态基本概念
多态是指一个引用(类型)在不同情况下的多种状态。也可以理解成:多态是指通过指向父类的引用,来调用在不同子类中实现的方法。
- <%@ page language="java" contentType="text/html; charset=UTF-8"
- pageEncoding="UTF-8"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>Insert title here</title>
- </head>
- <body>
- <script type="text/javascript">
- function Animal(){
- this.say=function(){
- alert("我是动物");
- };
- }
- function Dog(){
- this.say=function(){ //多态的实现需要重写父类对象的方法
- alert("我是狗");
- };
- }
- Dog.prototype=new Animal();//多态的实现需要原生继承
- function Cat(){
- this.say=function(){ //多态的实现需要重写父类对象的方法
- alert("我是猫");
- };
- }
- Cat.prototype=new Animal();
- function say(animal){
- if(animal instanceof Animal){
- animal.say();
- }
- }
- var dog=new Dog();
- var cat=new Cat();
- say(dog);
- say(cat);
- </script>
- </body>
- </html>
备注:多态利于代码的维护和扩展,当我们需要使用同一类树上的对象时,只需要传入不同的参数就行了,而不需要再new 一个对象。
JavaScript面向对象的三大特性的更多相关文章
- JavaScript中面向对象的三大特性(一个菜鸟的不正经日常)
经过几天的学习,把jQuery给啃会了,但是运用的还不算特别熟练,总感觉自己在JavaScript方面的基础十分欠缺,所以继续拾起JavaScript,开始更好的编程之旅~ 今天学的是JavaScri ...
- 谈谈Java面向对象的三大特性
Java面向对象的三大特性就是指封装.继承.多态了. 一.封装: 概念:封装是指隐藏对象的属性和实现细节,仅对外提供公共访问方式. (举例:笔记本电脑就是一个封装体,Java语言中最小的封装体就是函数 ...
- oc语言--面向对象的三大特性
一.封装 1.什么是封装 在程序上,隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别:将对象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的 ...
- OC面向对象的三大特性
一.面向对象的三大特性:封装(成员变量).继承和多态 1. set方法和get方法 1. set方法和get方法的使用场合 @public的成员可以被随意赋值,应该使用set方法和get方法来管理成员 ...
- java基础笔记(6)----面向对象的三大特性
简介:面向对象的三大特性就是封装,继承,多态,是面向对象的核心. 封装 简介:封装是类的边界,可以对数据起到保护作用 特性:属性私有,提供公开的get/set方法 属性私有:private 数据类型 ...
- C#基础知识之面向对象以及面向对象的三大特性
在C#基础知识之类和结构体中我详细记录了类.类成员.重载.重写.继承等知识总结.这里就记录一下对面向对象和面向对象三大特性的广义理解. 一.理解面向对象 类是面向对象编程的基本单元,面向对象思想其实就 ...
- Python面向对象3:面向对象的三大特性
面向对象的三大特性- 封装- 继承- 多态1 封装 - 封装就是对对象的成员进行访问限制- 封装的三个级别: - 公开,public - 受保护的,protected - 私有的,private - ...
- python 之面向对象的三大特性
面向对象的三大特性 继承 继承和组合 继承进阶 封装 封装(有待完善) 多态 多态
- Python 面向对象(创建类和对象,面向对象的三大特性是指:封装、继承和多态,多态性)
概念: ...
随机推荐
- npm报错没有权限
在npm install经常会报错没有权限 这个时候需要清除一下缓存 npm cache clean --force
- Genius ACM
题解: 发现匹配一定会选最大和最小匹配,确定左右端点之后nlogn排序后算 比较容易想到二分 最坏情况每次1个 $n^2*(logn)^2$ 没错暴力的最差复杂度是$n^2*logn$的 发现长度与次 ...
- 【BZOJ3697】采药人的路径
题解: 比较简单的点分治 首先暴力的话直接枚举 然后枚举另一个点的时候顺便看一下有没有零点 n^2 考虑点分治 分治之后用f[i][0/1]表示权值为i,有没有零点的方案数 我们来证明一件事情,如果两 ...
- [转]EndNote导入IEEE文献的方法
EndNote导入IEEE文献的方法.IEEE虽然可以批量导出,但是批量导出的是CSV格式.如果想导入到EndNote,需要一个个文献的导入.本文介绍一下IEEE导出文献并导入到EndNote的方法. ...
- eclipse4.2版本下面安装ADT,安装已经完成了,但没有ADT的那个图标显示
如果安装过程没错,直接在Eclipse ->window->customize Perpective->Command Groups Availability 勾选andorid 选 ...
- 根据关键字找进程id
#!/usr/bin/pythonimport subprocessimport sysimport loggingimport os gameproc = "jd_5.py" d ...
- ubuntu系统查看已安装的软件
1.查看安装的所有软件 dpkg -l 例如:dpkg -l | grep ftp 2.查看软件安装的路径 dpkg -L | grep ftp 也可以用 whereis ftp 3.查看软件版本 a ...
- Hbase的写入负载均衡
在写Hbase的时候,会担心数据分布在各个region上不均匀(与预分区无关): 这个时候可能想到的方式:hash.加盐等(当然是可以的,但是读取的时候咋办呢? 哪天写一个这样的文章) 本文采用新方式 ...
- Codeforces 356D Bacterial Melee dp
Bacterial Melee 我们发现所有合法串都是原序列的某个子序列(这个子序列相邻元素相等) 的扩展, 比如子序列为abc, 那么aabbbc, abbbcc 等都是合法串. 所以我们只需要dp ...
- springmvc+ajax——第三讲(post请求)
在ajax01.html中增加个input标签: 在ajax的js中增加: 在controller中仍然使用getParamter():