前言

都知道javascript的class只是语法糖而已,所以没法去对比,不在一个层次。

但是既然有了,总会有好奇的去对比。

那就对比一下。

面向对象的三个经典特性

封装

继承

多态

封装

指的是将对象的状态信息隐藏在对象内部,不允许外部程序直接访问对象内部信息,而是通过该类所提供的方法来实现对内部信息的操作和访问。

java、php、ts等等都是 提供了 3 个访问控制符:private、 protected 和 public ,代表 3 种不同的访问级别,再加上一个默认的访问控制级别,共有 4 个访问控制级别。

但是js尚无这些修饰符,最近也就出了个static吧,但是跟权限没关系。那js如何封装呢。

一般情况下利用ts或者js的闭包来实现

继承

js现在也可以基于类的继承已经可以使用了

不过依然是es5的那套寄生式组合继承而来的语法糖而已

寄生式组合继承

function inheritPrototype(subType, superType) {
let prototype = object(superType.prototype); // 创建对象
prototype.constructor = subType; // 增强对象
subType.prototype = prototype; // 赋值对象
} function SuperType(name) {
this.name = name;
this.colors = ["red", "blue", "green"];
}
SuperType.prototype.sayName = function () {
console.log(this.name);
}; function SubType(name, age) {
SuperType.call(this, name);
this.age = age;
} inheritPrototype(SubType, SuperType);
SubType.prototype.sayAge = function () {
console.log(this.age);
};

es6类继承

// 人类
class Person {
name = '人类';
page = 20;
say() {
console.log('我是人类');
};
} // 老师类
class Teacher extends Person {
name = '老师';
tage = 30;
/**
* @overwrite
* 子类重写父类方法
*/
say() {
console.log('我是老师');
};
} const tc = new Teacher(); // 我是老师
tc.say(); // 调用的是子类重写果的方法:我是老师
console.log(tc.name); // 调用的是子类自己的实例属性:老师
console.log(tc.tage); // 调用的是子类自己的实例属性:30
console.log(tc.page); // 调用的是继承至父类的实例属性:20
console.log(tc);// 打印结果和寄生式组合继承一样

子类会继承(有可能会重写父类属性或者方法的行为)父类所有的属性和方法

但是如果被重写了,则一切以子类为准。

多态

多态指的是相同类型的变量调用同一个方法时呈现出多种不同的行为特征。

多态的必要条件:继承、重写、向上转型。

拿java举例子

class People{
public String name = "人类";
public String page = "20";
public void getName(){
System.out.println("People"+this.name);
}
} class Teacher extends People{
public String name = "老师";
public String sage = "21";
public void getName(){
System.out.println("Teacher"+this.name);
}
} public class Main {
public static void main(String[] args) {
People tc = new Teacher();
tc.getName();
System.out.printf(tc.name);
}
}

通过向上转型,tc可以访问父类People的独有属性、但是不能再访问Teacher类的独有属性。

可以访问被重写的父类方法,但是只能访问被重写过的,不能访问父类的

People tc = new Teacher();
System.out.printf(tc.name); // 老师
System.out.printf(tc.page); // 20
System.out.printf(tc.sage); // 报错 People的实例tc 找不到属性sage
tc.getName(); // Teacher老师

因为js压根没有类型这一说,所以根本无法向上转型。自然而然的 js是不支持多态的。

用java的眼光看js的oop的更多相关文章

  1. JS中OOP之模拟封装和继承和this指向详解

    大家好,今天我带大家学习一下js的OOP, 大家都知道,面向对象有三个基本特征,继承,封装和多态,面向对象的语言有那么几种,C++,PHP,JAVA等,而功能强大的JS可以模拟实现面向对象的两大特征, ...

  2. 解密随机数生成器(二)——从java源码看线性同余算法

    Random Java中的Random类生成的是伪随机数,使用的是48-bit的种子,然后调用一个linear congruential formula线性同余方程(Donald Knuth的编程艺术 ...

  3. js面向对象oop编程

    理解对象 对象这个词如雷贯耳,同样出名的一句话:XXX语言中一切皆为对象! 对象究竟是什么?什么叫面向对象编程? 对象(object),台湾译作物件,是面向对象(Object Oriented)中的术 ...

  4. js中OOP小指南

    js中OOP小指南 在指南中,我将尝试解析以面向对象规范聚焦的es6的新特性. 首先, 什么是设计模式 范例是某个事务的例子或模型,在某种情况下,按照一种模式创建了计算机程序. 什么是面向对象 显然你 ...

  5. Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python

    Atitit.sql ast 表达式 语法树 语法 解析原理与实现 java php c#.net js python 1.1. Sql语法树 ast 如下图锁死1 2. SQL语句解析的思路和过程3 ...

  6. Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结

    Atitit java c# php c++ js跨语言调用matlab实现边缘检测等功能attilax总结 1.1. 边缘检测的基本方法Canny最常用了1 1.2. 编写matlab边缘检测代码, ...

  7. Java编程思想重点笔记(Java开发必看)

    Java编程思想重点笔记(Java开发必看)   Java编程思想,Java学习必读经典,不管是初学者还是大牛都值得一读,这里总结书中的重点知识,这些知识不仅经常出现在各大知名公司的笔试面试过程中,而 ...

  8. 在Java中直接调用js代码(转载)

    http://blog.csdn.net/xzyxuanyuan/article/details/8062887 JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Ja ...

  9. PHP笔记——java程序员看懂PHP程序

    PHP笔记——java程序员看懂PHP程序   php是一种服务器端脚本语言,类型松散的语言. <?php   ?>       xml风格 <script language=”ph ...

  10. 在Java中直接调用js代码

    JDK1.6版添加了新的ScriptEngine类,允许用户直接执行js代码. 在Java中直接调用js代码 不能调用浏览器中定义的js函数,会抛出异常提示ReferenceError: “alert ...

随机推荐

  1. vue路由params传参时出现undefined

    1.问题: 使用params方式传参时(参数不显示的方式) 获取参数时,参数undefined 2.解决: push时请使用name,不要使用path(路由的params对象使用,必须通过路由名nam ...

  2. 查看MySQL是否安装成功

    1)安装了Windows Service:MySQL80,并且已经启动. 2)安装了MySQL软件.安装位置为:C:\Program Files\MySQL  (默认路径) (MySQL文件下放的是软 ...

  3. doctrine 与 mysql 数据类型的详细转换规则。

    doctrine 与 mysql 数据类型的详细转换规则 // mysql -> doctrine array( 'tinyint' => 'boolean', 'smallint' =& ...

  4. hadoop部署安装(六)hive

    5.配置hive 5.1 hive下载地址 http://mirror.bit.edu.cn/apache/hive/ 解压缩 [root@master ~]# tar xf apache-hive- ...

  5. Java---switch...case中case可以匹配些什么

    switch-case语句 case 标签可以是 : •类型为 char.byte.short 或 int 的常量表达式. •枚举常量. •从 Java SE 7 开始,case 标签还可以是字符串字 ...

  6. servlet 作用域

    作用域总结 HttpServletRequest:一次请求,请求响应之前有效 HttpSession:一次会话开始,浏览器不关闭或不超时之前有效 ServletContext:服务器启动开始,服务器停 ...

  7. Linux系列:如何用perf跟踪.NET程序的mmap泄露

    一:背景 1. 讲故事 如何跟踪.NET程序的mmap泄露,这个问题困扰了我差不多一年的时间,即使在官方的github库中也找不到切实可行的方案,更多海外大佬只是推荐valgrind这款工具,但这款工 ...

  8. 信息资源管理综合题之“绘制利用RSA进行数字签名的过程图并进行简要说明”

    一.李三在上课中听不懂利用RSA进行数字签名的过程,老师便在黑板上清晰地画出了利用RSA进行数字签名过程图,李三方才明白是什么一回事.假设数字签名的原文方为A,按收方为B,A的公钥为(e,n),私钥为 ...

  9. 笔记 - linux子系统更换阿里云镜像源

    平时还是用 windows 多一些, 偶尔会玩一玩 linux, 之前给我一台多年的笔记本装了个 manjaro , 颜值是蛮高的, 就一点也不太熟, 就不想玩了, 还是用子系统, win 有支持 U ...

  10. AI编译器及TVM整体架构

    虽然之前也依据tvm官方文档写过一篇关于TVM架构的博客,但总感觉属于一种身在此山中的感觉(偏向于TVM实现的各个模块),并没有一览众山小的即视感(对框架的整体理解). 因此,今天再次请求出战... ...