js继承的几种方式

详解Xilinx FPGA高速串行收发器GTX/GTP(1)--SerDes和GTX的关系 阅读详情

看了w3school 上的ECMAScript 继承机制实现讲的几种方式,感觉还是有点乱,所以还是想再详细理一下继承的几种方式,分享给大家

1.构造函数继承

 //构造函数继承
  function Animal() {
      this.type = 'animal';
      this.play = function () {
        console.log('play')
      }
  }
  function Cat() {
      Animal.call(this);//关键代码
      this.name = 'cat'
      this.play = function () {
        console.log('play')
      }
  }

  console.log(new Cat(),new Animal());

查看打印结果,Cat确实继承了Amimal的属性和方法,那这个实现原理是怎么样的,看关键代码(call,apply不清楚了可以看下call和apply的使用),这里调用了父级Animal函数,然后让父级函数本身的this指向变成了子级Cat的实例对象,相当于父级的所有的属性和方法在子级Cat函数里再次声明了一次。但是这种方式也有弊端,看代码

 Animal.prototype.eat = function () {
     console.log('I can eat')
  }

再次打印结果

可以发现,当我们在原型链上添加属性和方法时,子级并没有继承父级的属性和方法

总结:构造函数继承只能继承在构造函数里声明的属性和方法,不可以继承父级原型链上的属性和方法

2.原型链继承 (之前讲过一章关于原型propotype的应用)

   //原型链继承
  function Animal() {
      this.type = 'animal';
      this.play = function () {
        console.log('play')
      }
  }
  function Cat() {
      this.name = 'cat'
  }
  Animal.prototype.eat = function () {
    console.log('i can eat')
  }
  Cat.prototype = new Animal();
  console.log(new Cat(),new Animal());

这种方式可以继承原型链上的属性,但是同样有弊端

 function Animal() {
      this.type = 'animal';
      this.play = function () {
        console.log('play')
      }
      this.body = ['head','arm']

  }
  function Cat() {
      this.name = 'cat'
  }

  Cat.prototype = new Animal();
  var cat1 = new Cat();
  var cat2 = new Cat();

  cat1.body.push('foot')
  console.log(cat1,cat2);

查看打印结果可以 ,我new了两个实例对象后,改变其中一个对象的属性,另外一个对象也会受到影响

总结:使用原型链继承,会导致有一个实例对象的属性发生改变时,会被其他实例对象所共享

3.组合继承

组合继承其实就是讲上述两种方式结合在一起

   //组合继承
  function Animal() {
      this.type = 'animal';
      this.play = function () {
        console.log('play');
      }
      this.body = ['head','arm'];

  }
  function Cat() {
      Animal.call(this);//Animal函数调用一次
      this.name = 'cat';
  }

  Animal.prototype.eat = function () {
    console.log('i can eat');
  }
  Cat.prototype = new Animal(); //Animal函数调用一次
  var cat1 = new Cat();
  var cat2 = new Cat();
  cat1.body.push('foot')
  console.log(cat1,cat2);

观察上述代码,显然Animal被调用两次,这无疑中增加了内存消耗

改进:

  将Cat.prototype = new Animal();  替换成下面两行
Cat.prototype = Object.create(Animal.prototype);
Cat.prototype.constructor = Cat;

将Cat原型对象设置成Animal的原型对象,通过实例对象的_proto_可以一层层往父级查找属性和方法,Cat.prototype的constructor还是Animal,所以我们需要再次把他赋值成Cat

总结:组合方式排除了构造函数继承和原型链继承的弊端,是JS中最常用的继承模式了

4.class继承 

class 是ES6新增的语法  

  class  Animal{
    constructor() {
        this.name = 'test';
    }
    play() {
          console.log('animal')
    }
  }

  class Cat extends Animal{
      constructor(type) {
        super(type);
        this.type ='cat'
      }
  }
  var cat = new Cat();
  console.log(cat.name)

直接class 创建一个类,使用extends来继承。

总结:最方便快捷的继承方式,但是仅支持ES6及以上版本,所以要考虑兼容性问题,其他没毛病

Pandas滚动窗口的妙用:动态计算列数据的最大值 Pandas的滚动窗口(rolling window)功能是数据分析中处理时间序列数据的重要工具。本文通过实例演示了如何使用rolling(window=4).max()计算DataFrame列A的滚动最大值,并将结果存入新列Max_Range。该方法会在4个元素的滑动窗口内计算最大值,前3行因数据不足显示为NaN。这种技术广泛应用于金融分析(如股价波动)、数据平滑和趋势识别等场景,能有效帮助分析数据的动态变化特征。示例展示了从数据准备到结果输出的完整流程,体现了Pandas在处理滑动窗口计算时的高效性和便 阅读详情

相关推荐

EEGnet模型论文讲解(画图详解三种卷积层操作)

我录了一个讲解视频:https://www.bilibili.com/video/BV1si4y1s7g7/ 目录 一、整体介绍 二、梳理激活函数 三、图解三种卷积层 (核心内容) 四、总结 一、整体介绍 EEGnet是为专门一般的脑电图识别任务而设计的通用且紧凑的卷积神经网络。(设计思路借鉴了MobileNet) 下图是EEGnet的整体结构图,只有三个卷积模块,重点是depthwise conv 和separable conv这两个卷积模块。 表格表明了EEGnet的...

Amigo_1997的博客 2万+

JS的几种继承方式

JS的几种继承方式

见贤思齐焉,见不贤内自省 221

低成本实现webhook接收端[python]

Webook本质上也是API,只不过是反向调用,即前端不主动发送请求,完全由后端推送。简单来说,Webhook是一个接受HTTP POST或是GET,PUT,DELETE的URL,一个实现了Webhook的API提供商就是在当事件发生的时候会向配置的URL发送信息,与请求-响应式不同,使用Webhook可以实时接收到变化。Ps:Webhook可能会发出大量的请求,确保接受的URL不被泄露或者应用能及时处理这些请求。

锡城小凯的博客 1万+

js继承的几种实现方式

js有几种经典的继承方式。比如原型链继承、构造函数继承、组合继承、寄生组合继承、ES6继承。让我们一一分析并实现。同时了解每种方案的优缺点。 文章目录1.原型链继承优点缺点2.构造函数继承优点缺点3.组合继承优点缺点4.寄生组合继承优点缺点5.ES6继承 其实js的继承本质上是通过原型链机制实现的扩展。不管是哪种继承方式,都是通过操作父类原型链和子类原型链形成关联关系实现的。只是不同实现中需要考虑不同的问题。在实际项目开发中,建议尽可能使用ES6的class extends实现。其他实现方式主要是理解背后的

A-Select ° 3130

ENVI基于Landsat影像构建郑州市2000-2019年遥感生态指数RSEI

本文基于landsat5、landsat7、landsat8三种传感器的影像,使用ENVI软件构建郑州市2000-2019年遥感生态指数RSEI。内含ENVI详细操作、使用的公式以及构建结果。

Lexicopperfield的博客 1万+

实战指南:在华为防火墙上构建基于自签CA的SSL证书挑战式认证体系

本文详细介绍了在华为防火墙上构建基于自签CA的SSL证书挑战式认证体系的实战指南。通过自签CA证书生成、华为防火墙SSL VPN配置、客户端安装与测试等步骤,帮助企业实现更安全的远程办公接入方案,有效防范密码泄露风险。文章重点讲解了证书挑战登录的实现原理和配置细节,适用于企业网络安全建设。

weixin_32428571的博客 256

js在html有几种存在方式,javascript实现继承有几种方式?

javascript实现继承的方式有哪些?下面本篇文章就来给大家介绍一下javascript实现继承的几种方式,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。实现继承的方式一:原型链实现方法:A原型的实例是B原型的属性不要忘记原型链中默认存在Object子类添加方法或重写超类方法要放在替换原型语句之后通过原型链实现继承后,不能使用对象字面量的方式创建方法和属性,因为会重写原型链通过...

weixin_32224199的博客 126

车载面试题目(ADAS)

多数功能都是依靠的前置传感器(经过Lidar、Radar、Camera融合),比如ACC、AEB、LKA、NOA、TJA、FCW等,只有少数涉及周视传感器,比如BSD、CVW、DOW。③如果前面有车切速度小于自车车速,自车减速对减速度有要求,比如3.5m/m2,④如果前车静止了,自车有个跟停距离要求,比如2-3m。试验场有不同曲率的弯道,比如125m、250m、500m的,根据需求跟车行驶,看是否会减速,能不能驶出弯道等。迭代内容:底层通讯、网络管理、诊断、刷写、信息安全、OTA。

qq_43475097的博客 2297

JavaScript实现继承的几种方式

JavaScript实现继承的几种方式 原型链继承 function Father(){ this.names = ['a','b']; } Father.prototype.getName = function(){ console.log(this.names); } function Child(){} Child.prototype = new Father(); /...

codezha的博客 178

宝塔面板磁盘扩容后不生效?5步搞定Linux服务器磁盘空间更新(附详细命令)

本文详细解析了Linux服务器磁盘扩容后宝塔面板显示不生效的常见问题。通过理解磁盘、分区、文件系统三层逻辑,提供5步解决方案:检查磁盘状态、安装growpart工具、扩展分区、使用resize2fs命令扩展文件系统,并最终验证结果。文中附有详细命令和针对XFS、LVM等进阶场景的指南,帮助用户彻底解决磁盘空间更新问题。

weixin_29271263的博客 127

廉价却有效?ESD防护中的电容

摘要:在成本敏感型电子产品设计中,多层陶瓷电容(MLCC)可作为TVS二极管的替代方案用于静电放电(ESD)防护。其工作原理是通过电容充放电特性吸收静电能量,而非电压钳位。计算表明100nF/50V MLCC可有效缓冲8kV静电冲击,但存在吸收能量有限、无自恢复等局限。建议将MLCC作为一级缓冲措施,配合TVS等器件形成多级防护,并优先选择X7R材质、100nF容值、50V耐压的0402/0603封装MLCC。该方案在低速信号和电源引脚防护中具有显著成本优势,但不能完全替代专业ESD抑制器。

硬核科技 430

在JavaScript中实现继承的几种方式

文章目录前言继承的几种方式构造方式继承进行测试结论修改原型继承进行测试结论(构造函数+修改原型)组合继承进行测试结论基于组合继承的优化测试结论总结 前言 JavaScript作为一门面向对象语言,自然有封装、继承、多态的特性,在其他面向对象语言中(如Java、python等),通过类来实现继承,而JavaScript中没有类的概念,于是JavaScript的继承方式区别于传统的继承方式,且有多种实现 继承的几种方式 以下为JavaScript中常见实现继承的方式,不代表全部。 构造方式继承 functi

weixin_44786791的博客 1511

从自然语言到PCB设计:DeepSeek与Altium协同自动化实战指南

摘要:在电子设计领域,将自然语言需求转化为PCB设计图是实现自动化设计的重要目标。受限于当前NLP和EDA技术,通过DeepSeek直接生成完整PCB设计图尚无法实现,但在设计辅助环节已展现实用价值。本文深入分析技术可行性,提出"自然语言→设计约束→脚本生成→人工验证"的人机协同工作流。通过28个完整代码示例、12张技术图表及5个工程案例,详细展示DeepSeek解析需求、生成设计约束,并结合Altium Designer API实现元件放置、规则设置、DRC校验的全流程。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1759

Javascript中的几种继承方式比较

开篇 从’严格’意义上说,javascript并不是一门真正的面向对象语言。这种说法原因一般都是觉得javascript作为一门弱类型语言与类似java或c#之类的强型语言的继承方式有很大的区别,因而默认它就是非主流的面向对象方式,甚至竟有很多书将其描述为’非完全面向对象’语言。其实个人觉得,什么方式并不重要,重要的是否具有面向对象的思想,说javascript不是面向对象语言的,往往都可能没有

追 1万+

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

JavaScript(JS) 中实现继承的几种方式

将父类的实例作为子类的原型,他的特点是实例是子类的实例也是父类的实例,父类新增的原型方法/属性,子类都能够访问,并且原型链继承简单易于实现,缺点是来自原型对象的所有属性被所有实例共享,无法实现多继承,无法向父类构造函数传参。为父类实例添加新特性,作为子类实例返回,实例继承的特点是不限制调用方法,不管是 new 子类()还是子类()返回的对象具有相同的效果,缺点是实例是父类的实例,不是子类的实例,不支持多继承。通过调用父类构造,继承父类的属性并保留传参的优点,然后通过将父类实例作为子类原型,实现函数复用。

Yongqiang Chen的博客 636

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

JS中几种继承的方式及缺点

JS中几种继承的方式及缺点 原型链继承 每个构造函数都有一个原型对象(通过prototype属性) 原型对象都包含一个指向构造函数的指针(通过constructor属性) 实例都包含一个指向原型对象的内部指针(通过隐式proto属性) 那么,若原型对象等于另一个原型的实例,则此时原型对象将包含一个指向另一个原型对象的指针。相应的另一个原型中也包含一个指向另一个构造函数的指针。如此层层递进,就构成了...

weixin_44260504的博客 224

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

JavaScript(js)实现继承的几种方式

1.原型链继承 核心:将父类的实例做为子类的原型对象 //动物类 function Animal(name,sex) { this.name = name || 'Animal'; this.sex = sex || '未知'; this.sleep = function () { console.log(this.name + "在睡觉!"); } } //添加原型属性和方法 Anima

weixin_47863547的博客 432

javascript实现继承的几种方式

function father(value){ this.value=value; } father.prototype.getValue=function(){ console.log(this.value) } function child(value){ father.call(this,value) } child.prototype=new father;...

jackyfgh的博客 588

js 知识点复习 javascript 继承的几种方式

javascript 继承可以理解为将一个对象所拥有的属性复制到另一个对象。这里记录几种实现的方式。 首先定义一个父级构造函数: // 父级构造函数 A function A () { this.name = 'A' this.age = 16 } A.prototype.sayHi = function () { console.log('Hi i am A') } 一、原型继承 原型继承是通过将子类的原型 prototype 赋值为父类实例的方式来实现。

大华阿大华的博客 236

简单了解一下js实现继承的几种方式

js实现继承 文章目录js实现继承1.==原型继承==(B.prototype=new A)把A的实例赋值给B的原型,那么通过B创建的实例,可以调用(继承)A的实例的私有属性和公有属性;这种继承方式就是原型继承原型继承 继承了私有属性和公有属性2 ==call继承==3 ==中间类继承==4 ==寄生组合继承== 1.原型继承(B.prototype=new A) 把A的实例赋值给B的原型,那么通...

weixin_44592971的博客 302

JS 实现继承的几种方式

现在有parent、child两个函数,child函数的实例想要访问parent函数的属性和方法(child想要继承parent)。

Cshaosun的博客 693

javascript的几种继承方式

通过继承,子类可以继承并使用父类的属性和方法。提高代码的复用。js继承主要是对构造函数和原型属性的继承。本文描述几种继承方式:原型链继承、组合继承、寄生组合式继承

吴佳陶的博客 585

javascript中继承的几种方式

在实际编码的过程中,如果有很多类似的方法都存放于构造函数中,这样会导致内存的浪费(内存泄漏),在这种情况下我们就需要用到继承。所谓继承就是通过某种方式让一个对象可以访问到另一个对象中的属性和方法。通过实例化一个函数使子类的原型指向父类的实例,子类就可以调用到父类的属性和方法。代码实现如下: 要注意的问题 1.不要忘记默认的类型: 在js中所有的引用类型都继承了Object,而继承也是通过原型链实现的。所有存在于Object原型对象上的方法同样也存在。比如:hasOwnProperty()、toString(

m0_63153901的博客 4374
上一篇: 关于原型propotype的应用
下一篇: webstorm配置ftp并上传到服务器
tomotoCoder
博客等级 码龄9年 8粉丝 12原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值