JavaScript作为弱类型语言,继承也是其强大的特性之一,那么如何在JavaScript中实现继承呢?
1,原型链继承
下面是最简单的原型链继承写法,代码如下:
Father.prototype={ getName:function(){ return '我的名字是:'+this.name; } }; function Father(name){ this.likeColor=['red']; } function Son(name){ this.name=name; } Son.prototype=new Father(); var son1=new Son(); son1.likeColor.push('green'); console.log(son1.likeColor);// ["red", "green"] var son2=new Son(); console.log(son2.likeColor);// ["red","green"]
优点:
1,父类对象中的属性和方法子类实例都可以继承
2,实现简单
缺点:
1,包含引用类型值的原型属性会被所有实例共享,一个实例改变了该属性,其它实例也会受到影响。
2,子类实例化时不能向父类构造函数传递参数。
2,借用构造函数
上面出现的两个问题可以通过借用构造函数的方式解决,如下实例:
function Father(name){ this.likeColor=['red']; this.name=name; this.getName=function(){ return '我的名字是:'+this.name; } } function Son(name){ Father.call(this,name); } var son1=new Son('张三峰'); son1.likeColor.push('green'); console.log(son1.likeColor);// ["red", "green"] console.log(son1.getName());//我的名字是:张三峰 var son2=new Son('张无忌'); console.log(son2.likeColor);// ["red"] console.log(son2.getName());//我的名字是:张无忌
使用借用构造函数的方式确实把上面两个问题都得到了解决,如果仅仅使用借用构造函数那么就无法避免构造函数模式存在的问题-----方法和属性都在构造函数中定义,父类原型中定义的属性和方法对子类不可见,复用就无从谈起。
优点:
1,不存在父类中引用类型属性共享的问题
2,构建子类型实例时可以向父类构造函数传递参数
缺点:
1,子类实例无法继承父类原型中的属性和方法。
2,要继承的属性和方法都要写在构造函数中,导致每实例化一次子类对象都要重新执行一次这些属性和方法,这样缺少了代码复用,影响代码性能。
3,组合继承
组合继承可以解决单独使用原型链继承和单独使用借用构造函数继承存在的问题,如下实例:
Father.prototype={ getName:function(){ return '我的名字是:'+this.name; } }; function Father(name){ this.likeColor=['red']; this.name=name; } function Son(firstName){ Father.call(this,firstName); } Son.prototype=new Father(); var son1=new Son('张三峰'); son1.likeColor.push('green'); console.log(son1.likeColor);// ["red", "green"] console.log(son1.getName());//我的名字是:张三峰 var son2=new Son('张无忌'); console.log(son2.likeColor);// ["red"] console.log(son2.getName());//我的名字是:无忌
组合继承避免了原型链和借用构造函数的缺点,融合二者的优点,成为最佳实现继承方式,最大的缺点就是父类构造函数会执行两次,子类原型对象会继承父类实例的全部属性,所以不得不在调用子类构造函数时在子类实例对象中重写这些属性。
4,寄生组合继承(圣杯模式)
寄生组合继承模式可以解决组合继承中存在的问题,如下实例:
var inherit=(function(){ return function(Target,Origin){ var prototype=Object.create(Origin.prototype) prototype.constructor=Target; Target.prototype=prototype; } })(); Father.prototype={ getName:function(){ return '我的名字是:'+this.name; } }; function Father(name){ this.likeColor=['red']; this.name=name; } function Son(name){ Father.call(this,name); } inherit(Son,Father); var son1=new Son('张三峰'); son1.likeColor.push('green'); console.log(son1.likeColor);// ["red", "green"] console.log(son1.getName());//我的名字是:张三峰 var son2=new Son('张无忌'); console.log(son2.likeColor);// ["red"] console.log(son2.getName());//我的名字是:张无忌
优点:几乎完美
缺点:实现较为复杂
相关推荐
本篇文章将深入探讨JavaScript实现继承的七种常见方式,帮助你更好地理解和运用这一概念。 1. 原型链继承(Prototype Chain Inheritance) 原型链是JavaScript实现继承的基础。每个函数都有一个`prototype`属性,这...
寄生组合继承解决了组合继承中父类构造函数会被调用两次的问题,通过创建父类的一个不被使用的实例,然后将子类的原型指向这个实例的原型。 ```javascript function inheritPrototype(subType, superType) { let ...
在ECMAscript中描述了原型链的概念,并将原型链作为实现继承的主要方法,其基本思想就是利用原型让一个引用类型继承另一个引用类型的属性和方法。 构造函数和原型还有实例之间的关系: 每个构造函数都有一个原型...
使用`zInherit`这种方式进行对象继承的好处在于,它可以保持对象的实例属性,避免了构造函数继承中的属性复制问题。同时,由于直接操作原型,它能够有效地利用原型链实现属性的查找和继承。 然而,`zInherit`也存在...
原型继承被认为是JavaScript中实现继承的“正宗”方式,因为它充分利用了JavaScript的原型链机制。然而,JavaScript社区为了克服这些限制,发展出了其他继承策略,比如组合继承(结合构造继承和原型继承)、寄生继承...
在JavaScript中,继承主要通过两种方式实现:原型链继承和类式继承。这两种方式并不是孤立存在的,它们经常被组合使用以达到更灵活的继承效果。 首先,我们需要理解继承的概念。在JavaScript中,继承允许一个对象...
首先,介绍一种常见的继承方式——对象伪装或构造继承。这种方法的基本思路是将父类的构造函数在子类的构造函数中调用,以便子类可以“继承”父类的属性和方法。如下面的示例所示: ```javascript function Animal...
在实际开发中,JavaScript还有许多库和框架,如jQuery、React、Vue和Angular,它们提供了更高效、更简洁的方式来处理常见的Web开发任务,如DOM操作、Ajax请求、动画效果等。这些库和框架的使用,使得JavaScript开发...
在JavaScript中,常见的继承模式有原型链继承、构造函数继承、组合继承、寄生继承、原型式继承、委托继承等。这里提到的"工具函数二"可能是介绍了一种或多种继承模式的实现方式。下面我们将详细讨论这些概念: 1. *...
- **实现方式**:常见的继承实现包括**原型链继承**、**构造函数继承**、**组合继承**、**寄生式继承**、**寄生组合继承**等。其中,最常用的是通过修改子类型原型(`prototype`)来实现继承,如文中提到的`...
在JavaScript中实现继承有多种方法,其中构造函数和原型链的方式是较为传统的一种,但在实际应用中存在一些问题和陷阱。本章节将深入分析这些常见的问题,并提出相应的解决方案。 首先,我们回顾一下使用构造函数和...
异步编程是JavaScript处理耗时操作的方式,常见的有回调函数、Promise和async/await等。 ES6(ECMAScript 2015)引入了许多新特性,如类(class)、模块(import/export)、箭头函数(=>)、解构赋值、let/const...
`this.callParent`这个概念在很多基于JavaScript的框架中非常常见,如ExtJS、Sencha Touch等。这些框架通过扩展JavaScript的继承机制,提供了更强大的类系统和方法调用链,使得开发大型复杂应用变得更加容易。 总结...
下面将详细介绍JavaScript中的一些常见命令。 1. 变量声明: JavaScript中的变量可以使用`var`、`let`或`const`进行声明。`var`是老式的变量声明,作用域为当前函数或全局;`let`和`const`是ES6新增的,`let`具有...
这个"javascript常见代码合集"包含了一系列实现常见效果的JavaScript代码示例,可以帮助开发者理解和学习JavaScript的基础以及进阶功能。 1. **变量与数据类型**: JavaScript支持基本数据类型(如字符串、数字、...
JavaScript提供了多种实现继承的方式,包括经典继承、原型链继承、构造函数继承、组合继承、原型式继承、寄生式继承、寄生组合式继承等。其中,最常见的可能是原型链继承和构造函数继承。 1. **原型链继承**:这是...
在JavaScript中,面向对象编程是一种常见的编程范式,尽管它与传统的面向对象语言(如Java或C++)有所不同。JavaScript没有类,但可以通过原型(prototype)机制来实现继承。以下是两种经典的JavaScript面向对象继承...
封装在JavaScript中有三种常见的实现方式: 1. **门户大开型**:这是最基础的创建对象的方法,所有属性和方法都是公共的,可以直接被外部访问。例如在`Book`类中,`name`和`getName`方法没有进行任何限制,任何人都...