java和javascript的继承不相同

443 阅读2分钟

「这是我参与2022首次更文挑战的第2天,活动详情查看:2022首次更文挑战

继承

继承是面向对象软件技术的一个概念,主要是为了能够复用已有的代码,也支持扩展自有的属性和方法。在使用 Java 或 c#等面向对象编程语言开发时 ,实现类的继承都通过关键字 extends 实现继承关系。

继承,其实就是子类继承父类的特征和行为,使得子类对象具有父类的实例域和方法,就是让子类拥有和父类相同的行为。

就比如,有Dog ,Cat ,Tiger 三种动物,都有名字,年龄等属性,都能够吃,睡觉,叫等行为,可以通过使用继承,使用父类的属性和方法,不同的睡法和叫声可以重写父类的方法,这样的继承可以减少代码量,也使得代码结构更清晰。

Java 或 C# 的继承

  • 继承分类

    • 单继承,一个类有且仅能继承一个实体父类
    • 多继承,一个类可以继承多个父类,但前提必须父类都是接口类
    • 多层继承:即B extends A ,C extends B ,C类就是多层继承,C类就有所有类的属性和方法
  • 继承特性

JavaScript 继承

JavaScript 是动态的,它的继承是怎么实现继承的?

JavaScript 只有一种结构:对象。

每个实例对象都有一个私有属性(称之为 proto )指向它的构造函数的原型对象(prototype)。该原型对象也有一个自己的原型对象(proto),层层向上直到一个对象的原型对象为 null。根据定义,null 没有原型,并作为这个原型链中的最后一个环节。

所以,JavaScript 发生继承关系后,我们访问一个对象属性时,它会在该对象上搜寻,还会搜寻该对象的原型,以及该对象的原型的原型,依次层层向上搜索,直到搜索到名字匹配的属性。

ES2015/ES6 中引入了 class 关键字,是否也有和基于类的语言 (如 Java 或 C#) 的一样实现继承关系?

当然不是,因为还是 通过extends 对子构造函数.prototype = new 父构造函数,这样进行底层封装处理了

function A(){}
var a = new A()
a.__proto__ = A.prototype

参考资料:

\