①抽象

js提供以下几种控制方法和属性的访问权限:

(1)公开级别:对外公开

(2)私有级别:类本身可以访问,不对外公开

案例如下所示:

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 undefined

20 50000

☞我们前面学习过,通过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();

②继承

(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天生就支持多态。

②封装

js面向(基于)对象编程-三大特征的更多相关文章

  1. JS面向(基于)对象编程--三大特征

    抽象 在讲解面向对象编程的三大特征前,我们先了解什么叫抽象,在定义一个类时候,实际上就是把一类事物的共有的属性和行为提取出来,形成一个物理模型(模板).这种研究问题的方法称为抽象. 封装 什么是封装? ...

  2. js面向(基于)对象编程—类(原型对象)与对象

    JS分三个部分: 1. ECMAScript标准--基础语法 2. DOM  Document Object Model 文档对象模型 3. BOM  Browser Object Moldel 浏览 ...

  3. JS面向(基于)对象编程--构造方法(函数)

    构造函数(方法)介绍 什么是构造函数呢?在回答这个问题之前,我们来看一个需求:前面我们在创建人类的对象时,是先把一个对象创建好后,再给他的年龄和姓名属性赋值,如果现在我要求,在创建人类的对象时,就直接 ...

  4. JavaScript学习总结(九)——Javascript面向(基于)对象编程

    一.澄清概念 1.JS中"基于对象=面向对象" 2.JS中没有类(Class),但是它取了一个新的名字叫“原型对象”,因此"类=原型对象" 二.类(原型对象)和 ...

  5. JavaScript学习总结(5)——Javascript面向(基于)对象编程

    一.澄清概念 1.JS中"基于对象=面向对象" 2.JS中没有类(Class),但是它取了一个新的名字叫"原型对象",因此"类=原型对象" ...

  6. JavaScript基于对象编程

    js面向对象特征介绍 javascript是一种面向(基于)对象的动态脚本语言,是一种基于对象(Object)和事件驱动(EventDirven)并具有安全性能的脚本语言.它具有面向对象语言所特有的各 ...

  7. python---面对对象的三大特征

    一.三大特征 面对对象的三大特征:继承.多态和封装,继承在面向对象类的创建中非常常见. 1.继承 为什么会有继承,当我们要创建一个新类的时候,发现他有很多属性或者反法都和我们另一个类的方法相同,这时我 ...

  8. 《Essential C++》读书笔记 之 基于对象编程风格

    <Essential C++>读书笔记 之 基于对象编程风格 2014-07-13 4.1 如何实现一个class 4.2 什么是Constructors(构造函数)和Destructor ...

  9. Python学习day24-面向对象的三大特征之继承

    figure:last-child { margin-bottom: 0.5rem; } #write ol, #write ul { position: relative; } img { max- ...

随机推荐

  1. 知其一不知其二之Jenkins Hacking

    转自安全脉搏 本文首发安全脉搏 感谢大王叫我来巡山 的投递 转载请注明来源 大多安全工作者听到jenkins都会知道有个未授权的命令执行 但是如果Script页面要授权才能访问呢 或者你的用户没有Ov ...

  2. 用PROXYCHAINS实现SSH全局代理

    NUX下可以实现SSH全局代理的软件有tsocks和proxychains两种,但是个人感觉proxychains要更加稳定简单. $ yum install proxychains # vim /e ...

  3. MYSQL 的optimize怎么用

    当对表有大量的增删改操作时,需要用optimize对表进行优化.可以减少空间与提高I/O性能,命令optimize table tablename;假如有foo表且存储引擎为MyISAM. mysql ...

  4. Async Await 使用

    1.简单例子 var sleep = function (time) { return new Promise(function (resolve, reject) { setTimeout(func ...

  5. apue学习笔记(第十章 信号)

    本章先对信号机制进行综述,并说明每种信号的一般用法. 信号概念 每个信号都有一个名字,这些名字都以3个字符SIG开头.在头文件<signal.h>中,信号名都被定义为正整形常量. 在某个信 ...

  6. js执行顺序总结

    参考博文:http://www.2cto.com/kf/201401/273825.html http://www.jb51.net/article/44123.htm http://zhidao.b ...

  7. PL/SQL Developer 和 instantclient客户端安装配置

    PL/SQL Developer 和 instantclient客户端安装配置 oracle的安装我就不写了,不会安装的网上随便找一个教程就能装上,安装起来比較简单.可是,PL/SQL Develop ...

  8. 深入解析Windows窗体创建和消息分发

    Windows GUI採用基于事件驱动的编程模型,其实差点儿全部的界面库都是这样做的.在纯粹的Window32 SDK编程时代.人们还能够搞懂整个Windows窗口创建和消息的流通过程.可是在如今各种 ...

  9. 面试题 15:链表中倒数第 k 个结点

    面试题 15:链表中倒数第 k 个结点 题目:输入一个链表,输出该链表中倒数第 k 个结点.为了符合大多数人的习惯, 本题从 1 开始计数,即链表的尾结点是倒数第一个结点.例如一个有 6 个结点的 链 ...

  10. php的一个小坑,输出不了json_encode

    明明是旧代码,怎么换个地方就不执行了.一开始怀疑是Php的版本. 最后才知道是我的编辑器nodepad++给坑了.或许不是nodepad++的坑.总之,需要转化为utf-8格式编码即可