js常用的继承方式

2024-09-04 21:18
文章标签 js 方式 常用 继承

本文主要是介绍js常用的继承方式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1.原型链继承

不考虑函数参数的情况下,我这样写

   function Animal(){this.family=['father','mother'];this.age=12;}function Cat(){}Cat.prototype=new Animal();var cat=new Cat();
//         console.log(cat.family);   //可以正常输出
//         console.log(cat.age);cat.family.push('sister');   //cat改变family属性console.log(cat.family);//改变已经体现var cat1=new Cat(); //创建第二个实例console.log(cat1.family);//也出现了“sister”,所有的实例都被改变,这显然不是我们想要的结果var animal=new Animal();console.log(animal.family);//父类Animal没有改变,由此说明只是Cat发生了永久改变,所有的new Cat()实例都将体现该变化
考虑接受参数的情况

  function Animal(age){this.family=['father','mother'];this.age=age;}function Cat(age){}Cat.prototype=new Animal();var cat=new Cat(12);console.log(cat.age);//undefined,参数传递失败,显然我们不能为每个实例单独传递参数


2.对象冒充

参数传递的问题,我们使用call(或者apply)解决

  function Animal(age){this.family=['father','mother'];this.age=age;}function Cat(cat_age){Animal.call(this,cat_age)//Cat的this指向Animal对象,并且将参数cat_age传递到Animal}var cat=new Cat(12);console.log(cat.age);//12,在使用call的情况下参数传递问题已经解决
再来看看这种方式有没有解决原型链继承中一个实例属性改变导致所有实例属性改变的问题

 function Animal(age){this.family=['father','mother'];this.age=age;}function Cat(cat_age){Animal.call(this,cat_age)//Cat的this指向Animal对象,并且将参数age传递到Animal}var cat=new Cat(12);cat.family.push('sister');console.log(cat.family);//father,mother,sistervar cat1=new Cat(12);console.log(cat1.family);//father,mother问题已经解决
这种方式实现的继承是不是完美无缺呢??看下面代码

function Animal(age){this.family=['father','mother'];this.age=age;this.getInfo=function(){return this.age+' '+this.family;}}function Cat(cat_age){Animal.call(this,cat_age)//Cat的this指向Animal对象,并且将参数age传递到Animal}var cat=new Cat(12);var cat1=new Cat(13);console.log(cat.getInfo());//12 father,motherconsole.log(cat1.getInfo());//13 father,motherconsole.log(cat.getInfo==cat1.getInfo);//false

说明两个实例调用的是不同的getInfo()函数,我们希望getInfo()函数是可以复用的,不需要创建多个,我们考虑用继承来解决这个问题

function Animal(age){this.family=['father','mother'];this.age=age;}Animal.prototype.getInfo=function(){return this.age+' '+this.family;}function Cat(cat_age){Animal.call(this,cat_age)//Cat的this指向Animal对象,并且将参数age传递到Animal}var cat=new Cat(12);var cat1=new Cat(13);console.log(cat.getInfo==cat1.getInfo);//trueconsole.log(cat.getInfo());//报错console.log(cat1.getInfo());//报错

说明cat和cat1访问不到Animal原型上的东西

那怎么解决呢??接下来学习没毛病的组合继承,这也是最常用的一种继承方式

3.组合继承

 function Animal(age){this.family=['father','mother'];this.age=age;}Animal.prototype.getInfo=function(){return this.age+' '+this.family;}function Cat(cat_age){Animal.call(this,cat_age)//Cat的this指向Animal对象,并且将参数age传递到Animal}Cat.prototype=new Animal();var cat=new Cat(12);var cat1=new Cat(13);console.log(cat.getInfo==cat1.getInfo);//trueconsole.log(cat.getInfo());//12 father,motherconsole.log(cat1.getInfo());//13 father,mother
好了,组合继承成功将原型链继承和对象冒充的缺陷弥补,并继承了他们所有优点,没毛病

这篇关于js常用的继承方式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1137052

相关文章

gradle第三方Jar包依赖统一管理方式

《gradle第三方Jar包依赖统一管理方式》:本文主要介绍gradle第三方Jar包依赖统一管理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录背景实现1.顶层模块build.gradle添加依赖管理插件2.顶层模块build.gradle添加所有管理依赖包

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Linux之systemV共享内存方式

《Linux之systemV共享内存方式》:本文主要介绍Linux之systemV共享内存方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、工作原理二、系统调用接口1、申请共享内存(一)key的获取(二)共享内存的申请2、将共享内存段连接到进程地址空间3、将

Maven中引入 springboot 相关依赖的方式(最新推荐)

《Maven中引入springboot相关依赖的方式(最新推荐)》:本文主要介绍Maven中引入springboot相关依赖的方式(最新推荐),本文给大家介绍的非常详细,对大家的学习或工作具有... 目录Maven中引入 springboot 相关依赖的方式1. 不使用版本管理(不推荐)2、使用版本管理(推

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

Java对象转换的实现方式汇总

《Java对象转换的实现方式汇总》:本文主要介绍Java对象转换的多种实现方式,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录Java对象转换的多种实现方式1. 手动映射(Manual Mapping)2. Builder模式3. 工具类辅助映

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Spring Boot读取配置文件的五种方式小结

《SpringBoot读取配置文件的五种方式小结》SpringBoot提供了灵活多样的方式来读取配置文件,这篇文章为大家介绍了5种常见的读取方式,文中的示例代码简洁易懂,大家可以根据自己的需要进... 目录1. 配置文件位置与加载顺序2. 读取配置文件的方式汇总方式一:使用 @Value 注解读取配置方式二

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

JAVA保证HashMap线程安全的几种方式

《JAVA保证HashMap线程安全的几种方式》HashMap是线程不安全的,这意味着如果多个线程并发地访问和修改同一个HashMap实例,可能会导致数据不一致和其他线程安全问题,本文主要介绍了JAV... 目录1. 使用 Collections.synchronizedMap2. 使用 Concurren