JavaScript实现继承的几种方式


在JavaScript中,面向对象编程是实现复杂功能和代码复用的关键。继承是面向对象的核心特性之一,它允许一个对象(子类)从另一个对象(父类)获取属性和方法,从而形成类之间的层次结构。本篇文章将深入探讨JavaScript中实现继承的几种常见方式。 1. 原型链继承 JavaScript的原型(prototype)机制是实现继承的基础。每个函数都有一个prototype属性,这个属性指向一个对象,这个对象的属性和方法可以被实例共享。通过将一个对象设置为另一个对象的原型,我们可以实现继承。 ```javascript function Parent() {} Parent.prototype.name = 'parent'; function Child() {} Child.prototype = Object.create(Parent.prototype); Child.prototype.constructor = Child; Child.prototype.sayHello = function() { console.log('Hello'); } let child = new Child(); console.log(child.name); // parent child.sayHello(); // Hello ``` 2. 构造函数继承(借用构造函数) 这种方法是通过在子类的构造函数中调用父类的构造函数来实现继承。尽管它能将父类的属性复制给子类,但无法继承原型上的属性和方法。 ```javascript function Parent(name) { this.name = name; } Parent.prototype.sayHello = function() { console.log('Hello'); } function Child(name) { Parent.call(this, name); } Child.prototype.sayHello = function() { console.log('Hi'); } let child = new Child('child'); console.log(child.name); // child child.sayHello(); // Hi ``` 3. 组合继承 组合继承结合了原型链继承和构造函数继承的优点,避免了父类构造函数被多次调用的问题。它首先通过构造函数复制属性,然后通过原型链继承方法。 ```javascript function Parent(name) { this.name = name; } Parent.prototype.sayHello = function() { console.log('Hello'); } function Child(name) { Parent.call(this, name); } Child.prototype = Object.create(Parent.prototype); Child.prototype.constructor = Child; Child.prototype.sayBye = function() { console.log('Bye'); } let child = new Child('child'); console.log(child.name); // child child.sayHello(); // Hello child.sayBye(); // Bye ``` 4. 寄生组合继承 寄生组合继承解决了组合继承中父类构造函数会被调用两次的问题,通过创建父类的一个不被使用的实例,然后将子类的原型指向这个实例的原型。 ```javascript function inheritPrototype(subType, superType) { let prototype = Object.create(superType.prototype); prototype.constructor = subType; subType.prototype = prototype; } function Parent(name) { this.name = name; } Parent.prototype.sayHello = function() { console.log('Hello'); } function Child(name) { Parent.call(this, name); } inheritPrototype(Child, Parent); Child.prototype.sayBye = function() { console.log('Bye'); } let child = new Child('child'); console.log(child.name); // child child.sayHello(); // Hello child.sayBye(); // Bye ``` 5. 寄生式继承 寄生式继承不是用来实现继承,而是用于改进对象。它创建一个父对象的副本,然后修改这个副本,最后返回这个副本。 ```javascript function object(o) { function F() {} F.prototype = o; return new F(); } function inherit(parent, child) { let obj = object(parent); child.prototype = obj; child.prototype.constructor = child; } function Parent() {} Parent.prototype.name = 'parent'; function Child() {} inherit(Parent, Child); Child.prototype.sayHello = function() { console.log('Hello'); } let child = new Child(); console.log(child.name); // parent child.sayHello(); // Hello ``` 6. 动态原型继承 这种模式在实例化对象后才设置其原型,这使得原型可以在运行时根据需要动态改变。 ```javascript function Parent() {} Parent.prototype.sayHello = function() { console.log('Hello'); } function Child() {} let child = new Child(); child.prototype = Object.create(Parent.prototype); child.prototype.constructor = Child; child.prototype.sayBye = function() { console.log('Bye'); } child.sayHello(); // Hello child.sayBye(); // Bye ``` 以上就是JavaScript中常见的几种继承方式,每种都有其优缺点。在实际开发中,可以根据项目需求和性能考虑选择合适的方法。随着语言的发展,ES6引入了类(class)的概念,虽然在语法上更像传统的面向对象语言,但其底层仍然是基于上述的原型机制。了解这些基础概念有助于我们更好地理解和使用JavaScript的继承机制。





































- 1


- 粉丝: 389
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 2020年博客网站设计的开题报告.doc
- 国税网络发票系统的与实现.doc
- ACM在线评测系统设计报告-软件工程实训课程设计.doc
- 24基于物联网的信息系统课件高二上学期高中信息技术必修2第2单元教科版(1).pptx
- 电子商务就业计划书.doc
- 2020年卫星通信应用系统对水文工作的应用论文.doc
- 人工智能行业发展趋势PPT.pptx
- 通信行业防汛演练方案.docx
- 《电子商务本质》课件.ppt
- 计算机教室工作计划及总结精选(13篇).docx
- 无线网络覆盖设计专业技术方案.doc
- 最全的事业单位测验考试计算机知识测验考试.doc
- 广电网络公司手机电视可行性研究报告.doc
- 手机游戏网络推广的方案案例.doc
- 2024年运维软件项目投资申请报告.docx
- 数据库学生成绩管理系统课程设计.doc


