JS 基础篇(三):原型继承

基于CANopenNode协议栈在正点原子探索者开发板上进行移植 配置好之后进行采用keil IDE进行代码生成即可,还需要进行CANopenNode的代码集成,并参照demo进行代码移植。发送完成后心跳包以1s的周期重新开始发送。正点原子的开发板引出的是CAN1接口。这里的心跳时间间隔设置为100ms。则将心跳包周期设置为0。 阅读详情

目录:

以下将介绍对象之间“继承”的五种方法。
目前我们有一个父类为Animal类,我们需要在它的基础上,继承创建一个Cat类,即让Cat类继承Animal类。

function Animal(){
   this.species = "动物";
   this.eat = function(){
      console.log("eat");
   }
}
一、构造函数绑定

第一种方法也是最简单的方法,使用call或apply方法,将父对象的构造函数绑定在子对象上,即在子对象构造函数中加一行:

function Cat(name,color){

  Animal.call(this);

  this.name = name;

  this.color = color;

}

var cat1 = new Cat("大毛","黄色");

alert(cat1.species); // 动物

但是调用了Animal构造函数不等于继承了Animal,Cat创建的对象的原型是:

new Cat() ----> Cat.prototype ---> Object.prototype ----> null

cat1实例对象仅仅只是获得了Animal构造函数中的属性和方法,它并没有获取到Animal原型对象中的属性和方法,我们要的原型链应该是:

new Cat() ----> Cat.prototype ----> Animal.prototype ---> Object.prototype ----> null

因此,第一种方法不推荐。

二、prototype模式

第二种方法更常见,使用prototype属性。
如果"猫"的prototype对象,指向一个Animal的实例,那么所有"猫"的实例,就能继承Animal了。

function Cat(name,color){
     Animal.call(this);

     this.name = name;

     this.color = color;
}

Cat.prototype = new Animal();

Cat.prototype.constructor = Cat;

var cat1 = new Cat("大毛","黄色");

alert(cat1.species); // 动物

1、Cat.prototype = new Animal(); 将Cat的prototype对象指向一个Animal的实例。
2、Cat.prototype.constructor = Cat;任何一个prototype对象都有一个constructor属性,指向它的构造函数。当我们定义了Cat.prototype = new Animal(); 时,此时的Cat.prototype.constructor指向Animal,因此我们需要重新将constructor纠正回Cat。

第二种方式的完美的实现了让Cat类继承Animal类,但是需要创建两次Animal,比较浪费资源。
在这里插入图片描述

三、直接继承prototype

由于Animal对象中,不变的属性都可以直接写入Animal.prototype。所以,我们也可以让Cat()跳过 Animal(),直接继承Animal.prototype。

首先将Animal对象改写

function Animal(){ }

Animal.prototype.species = "动物";
Animal.prototype.eat = function(){
    console.log("eat");
}

然后,将Cat的prototype对象,然后指向Animal的prototype对象,这样就完成了继承。

Cat.prototype = Animal.prototype;

Cat.prototype.constructor = Cat;

var cat1 = new Cat("大毛","黄色");

alert(cat1.species); // 动物

与前一种方法相比,这样做的优点是效率比较高(不用执行和建立Animal的实例了),比较省内存。缺点是 Cat.prototype和Animal.prototype现在指向了同一个对象,那么任何对Cat.prototype的修改,都会反映到Animal.prototype。同时无法继承到Animal构造函数中的一切属性和方法。

因此,第三种方法不推荐。

四、利用空对象作为中介

由于"直接继承prototype"存在上述的缺点,所以就有第四种方法,利用一个空对象作为中介。

function Cat(name,color){
  Animal.call(this);

  this.name = name;

  this.color = color;
}
var F = function(){};

F.prototype = Animal.prototype;

Cat.prototype = new F();

Cat.prototype.constructor = Cat;

var cat1 = new Cat("大毛","黄色");

F是空对象,所以几乎不占内存。这时,修改Cat的prototype对象,就不会影响到Animal的prototype对象。同时可以通过添加Animal.call(this);选择是否将Animal构造函数内的属性和方法都保存在与Cat中。
在这里插入图片描述

五、寄生组合式继承:保证原型继承中父级引用对象属性的独立性
function Cat(name,color){
       
    Animal.call(this);

  this.name = name;

  this.color = color;
}

Cat.prototype = Object.create(Animal.prototype);

Cat.prototype.constructor = Cat;

var cat1 = new Cat("大毛","黄色");

Cat直接以Animal.prototype的原型为原型,而不是new Animal(),那么也就不会继承Animal自己的属性,而又完美继承了Animal原型上的eat方法。通过借用构造函数又实现了引用属性的独立性。
在这里插入图片描述

六、ES6继承通过Babel编译成ES5的实现方法

通过使用ES6语法编写继承类,然后使用Babel编译成ES5语法的实现方式是:

function _inherits(subClass, superClass) { 

  subClass.prototype = Object.create(superClass.prototype, { 
    constructor: { 
      value: subClass, 
      enumerable: false, 
      writable: true, 
      configurable: true 
    } 
  }); 
  
  subClass.__proto__ = superClass; 
}

function Supper() {};

var Sub = function (_Supper) {
  _inherits(Sub, _Supper);

  function Sub() {
    return Sub.__proto__.call(this);
  }

  return Sub;
}(Supper);


var demo = new Sub();
七、 拷贝继承

我们也可以换一种思路,纯粹采用"拷贝"方法实现继承。简单说,如果把父对象的所有属性和方法,拷贝进子对象,不也能够实现继承吗?

首先将Animal对象改写

function Animal(){ }

Animal.prototype.species = "动物";
Animal.prototype.eat = function(){
     console.log("eat");
}

然后,再写一个函数,实现属性拷贝的目的。

function extend2(Child, Parent) {

  var p = Parent.prototype;

  var c = Child.prototype;

  for (var i in p) {

    c[i] = p[i];

  }

  c.uber = p;

}

这个函数的作用,就是将父对象的prototype对象中的属性,一一拷贝给Child对象的prototype对象。这种方式只会将Animal.prototype中的属性和方法拷贝到子类中,而且十分的不方便。

因此,这种方法不推荐。

南邮-软件设计实验(C++版) 南邮软件设计 A档 一、分数统计 课题内容:   设计一个分数统计程序。包括学生信息的输入输出以及排序。通过该课题全面熟悉数组、字符串、文件的使用,掌握程序设计的基本方法及友好界面的设计。 课题要求: (1)输入某班级学生的姓名、分数; (2)对(1)的分数进行降幂排列并输出; (3)具有输入输出界面。 示例代码: #include<bits/stdc++.h> using... 阅读详情

相关推荐

SPSS与SPSS Modeler,不一样的世界

1. SPSS软件的前世今生 1.1 IBM SPSS的由来 与数据打过交道的小伙伴们,应该对SPSS软件都不陌生。SPSS是世界上最早的统计分析软件,由斯坦福大学的三个研究生大牛于1968年研发,同时还成立了SPSS公司。SPSS最初的全称是Solutions Statistical Package for the Social Sciences(社会科学统计软件包),随着SPSS产品服务领...

qq_24339451的博客 3613

一文梳理js中各种继承方式

一文总结梳理js中各种继承方式,加深理解各种继承的优缺点。

qq_52569656的博客 199

基于大模型的急性重症胰腺炎全流程预测与诊疗方案研究

本研究构建了基于大模型的急性重症胰腺炎(SAP)全流程预测与诊疗系统,实现了从术前风险评估到术后康复管理的精准诊疗闭环。通过整合临床信息、实验室检查和影像学等多源数据,模型在测试集上预测准确率达X%,AUC为X,显著优于传统评分系统。研究创新性地将预测结果应用于手术方案制定、麻醉决策、并发症防控及个性化护理,形成智能化诊疗方案。验证结果显示模型具有良好的稳定性和临床适用性,同时配套的健康教育体系提升了患者自我管理能力。尽管存在样本局限性和模型可解释性等不足,该研究为SAP的精准诊疗提供了新范式,未来可通过扩

嵌入式毕设/课设资料清单(速查手册·文档模板·题库,持续更新)→ 见最新文章 1115

class继承做了什么?

目的 以babel编译的class继承为基础,了解目前class继承的原理 理解过程 babel编译结果 Reference: babel Try it out! class a extends b{ constructor(){ super() this.c= "haha" } } 复制代码被编译为 继承做了什么? 第一步 _inherits(a,_b)实现继承 fun...

weixin_34085658的博客 247

无人机VS地面机器人:用AirSim和Gazebo玩转ROS2仿真的5个实战场景对比

本文深度对比了ROS2生态中两大仿真工具AirSim和Gazebo在无人机与地面机器人应用中的表现。通过电力巡检、仓库调度、SLAM建图等5个实战场景,分析了两者在视觉保真度、物理精度、开发效率等方面的差异,并提供了跨平台协作的实用技巧,帮助开发者根据项目需求选择合适的仿真工具。

flink9streamer的博客 900

从生成到检测:全面解析Deepfake技术的演进与对抗策略

本文全面解析了Deepfake技术的演进与对抗策略,从GAN生成技术到先进的检测手段,探讨了其在娱乐与安全领域的双重影响。文章详细介绍了Deepfake的核心原理、技术迭代关键节点以及最新的检测方法,揭示了AI生成与识别的激烈博弈。同时,展望了量子计算和生物特征认证在未来攻防战中的潜在应用。

jenkins8butler的博客 255

JavaScript ES6新的类继承特性学习笔记

Javascript新标准ES6正式出来都一年多了,最近才有时间愿意集中精力研究下,发现有些新特性确实亮瞎了我的双眼,比如,最新的“类-实例”的支持,再比如模仿Python引入gennerator等等。下面和大家分享下我ES6类继承的学习笔记吧。JavaScript的标准——ECMAScript在不断发展,最新版ECMAScript 2015标准(简称ES6)已经在2015年6月正式发布了。新版本的

kikaylee的专栏 1万+

学习STM32的无人机控制

设计并实现无人机控制系统,使用STM32单片机进行控制。无人机控制系统主要包括飞行控制、姿态控制、定位导航等功能。以下是一个基于STM32的无人机控制系统的代码案例。以上是一个基于STM32的无人机控制系统的代码案例,包括飞行控制、姿态控制和定位导航等功能。请根据实际情况进行修改和完善。

qq_67153941的博客 837

原型继承

在编程中,我们经常会想获取并扩展一些东西。 例如,我们有一个user对象及其属性和方法,并希望将admin和guest作为基于user稍加修改的变体。我们想重用user中的内容,而不是复制/重新实现它的方法,而只是在其至上构建一个新的对象。 原型继承(Prototypal inheritance)这个语言特性能够帮助我们实现这一需求。 [[Prototype]] 在 ...

guiguiann789的博客 519

HP iLO4报错自救指南:Embedded Flash/SD-CARD故障的3种修复方案(附详细截图)

本文详细解析了HP iLO4出现'Embedded Flash/SD-CARD'故障时的3种修复方案,包括快速恢复、固件级修复和硬件级解决方案。通过Diagnostics诊断和Self-Test报告,帮助运维人员高效解决问题,并提供预防性维护建议,确保服务器远程管理功能的稳定性。

weixin_42522953的博客 510

PrimeTime low power-多电压设计流程(1)

PrimeTime支持使用IEEE 1801统一电源格式(UPF)标准来指定设计的多电压特性。PrimeTime能够在多电压供电和使用set_voltage命令在特定电源网上设置电压值的情况下,正确分析设计的时序。要了解如何使用多电压设计流程,请参考以下内容:- 多电压分析需求- 指定电源连接性- UPF命令- GoldenUPF流程- 多重电源电压分析。

QRBQ 528

关于对象继承的问题——利用空对象做中介

先上例子: function Animal(){ this.type='动物'; } function Cat(name, color){ this.name=name; this.color=color; } //定义继承函数 function extend(Child, Parent){ ...

weixin_34378969的博客 235

解决anaconda占用C盘空间过多问题

anaconda就算安装在其他盘,默认会把索引、锁定文件、压缩包等都放到系统盘(C盘),我用了两年,占用30GB。 1. 卸载不用的虚拟环境 查看已安装的虚拟环境 conda env list 卸载不用的、过期的虚拟环境 conda remove -n (要卸载的环境的名字) --all 2. 删除索引缓存、锁定文件、未使用过的包和tar包 conda clean -a 清理完之后,删除了15GB,还剩15GB,舒服了 ...

沉迷单车的追风少年 3万+

js原型继承

这是一道非常经典的前端面试题,尤其是对于初中级前端来说,基本上是必考题。

qq_38217940的博客 4567

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Devexpress16.2.6破解工具

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

【JavaScript】js中的原型继承

js中的原型继承

南栀的博客 3705

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

JS 基础篇(原型和继承)

原型主要是用来存公共属性和方法 function Animal(){ } var a=new Animal() a._prop_=Animal.prototype//对象的_prop_指向函数对象的原型 a.constructor=Animal//对象的构造函数指向函数对象 //a即为Animal的实例也为Animal.prototype的实例 在这里插入代码片 原型继承 function...

一点一滴 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

【JavaScript】原型继承详解

在面向对象编程中,继承是一个对象可以从另一个对象获得属性和方法的机制。JavaScript 使用原型继承而非类继承,每个对象都有一个隐式关联的原型对象(通过__proto__引用),并且可以访问该原型对象的属性和方法。构造函数是 JavaScript 中用于创建对象的函数。通过使用new关键字,可以调用构造函数并创建新的对象实例。每个构造函数都会自动拥有一个prototype属性,指向一个包含所有实例共享属性和方法的对象。// 输出:Dog在这个例子中,Animal是一个构造函数,dog是。

lph159的博客 2049

JS基础 原型与继承

阅读目录原型基础原型对象使用数组原型对象的 concat 方法完成连接操作默认情况下创建的对象都有原型。以下 x、y 的原型都为元对象 Object,即JS中的根对象创建一个极简对象(纯数据字典对象)没有原型(原型为 `null`)函数拥有多个原型,prototype 用于实例对象使用,`__proto__` 用于函数对象使用原型关系分析,与方法继承的示例使用构造函数创建对象的原型体现`constructor` 存在于 `prototype` 原型中,用于指向构建函数的引用。使用对象的 `construct

wgchen 2585

JS Raccoon:掌握JavaScript原型链与继承的完整教程

JS Raccoon是一个专注于Web开发技巧的开源项目,提供了丰富的JavaScript编程指南。本教程将帮助你彻底理解JavaScript中独特的原型链与继承机制,这是掌握面向对象编程的核心基础。 ## 为什么原型链是JavaScript开发者的必备知识? JavaScript作为一门灵活的脚本语言,其对象模型与传统的类式继承语言有本质区别。理解原型链不仅能帮助你写出更优雅的代码,还能让你

gitblog_00071的博客 617

JavaScript:原型、原型链、继承

每个函数都有一个 prototype(原型)属性,这个属性是一个指针,指向一个对象, 而这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法,使用原型对象的好处是可以 让所有对象实例共享它所包含的属性和方法。当你创建一个对象时,Javascript会从该对象的构造函数的原型对象中查找属性和方法。结合第四种中提及的继承方式,解决普通对象的继承问题的 Object.create 方法,我们在前面这几种继承方式的优缺点基础上进行改造,得出了寄生组合式的继承方式,这也是所有继承方式里面相对最优的继承方式。

snow的博客 1625

js原型继承和原型链继承以及注意事项

* 就是子对象自动拥有父对象的属性和方法, 继承可以提高代码的复用性。 * JS里的继承主要依靠是的原型链。让原型对象(每一个构造函数都有一个原型对象)的值,等于另一个类型的实例,即实现了继承;另外一个类型的原型再指向第三个类型的实例,以此类推,也就形成了一个原型链 function Animal(newName,newAge){ this.name = newName; ...

素描本里的男子的博客 3774

js原型、原型链和继承

继承是指将特性从父代传递给子代,以便新代码可以重用并基于现有代码的特性进行构建。JavaScript 使用对象实现继承。每个对象都有一条链接到另一个称作原型的对象的内部链。该原型对象有自己的原型,依此类推,直到原型是 null 的对象。

hole_diss的博客 1237

JavaScript 中基于原型和原型链的继承方式详解

继承方式是否共享引用属性能否传参能否继承原型方法父构造函数调用次数是否推荐原型链继承是否是1(设置原型时)❌构造函数继承否是否1(子构造中)⚠️ 局限组合继承否是是2⚠️ 可用但非最优寄生组合式继承(空对象中介)否是是1✅ 强烈推荐(ES5)原型式继承(Object.create)是否是(来自源对象)0✅ 特定场景适用。

2501_92872533的博客 937

【JavaScript——原型、原型链、继承】

早期的浏览器只能用来浏览,不能交互,校验的工作留给后台报错。但是这样很消耗性能,于是,JavaScript需要完成一些更复杂的工作。当时流行面向对象,Javascript设计者仿造Java设计继承,但是设计成像java一样的继承,会增加学习成本,让语言过重。Java等语言继承最终new的是构造函数,于是Js借鉴了这一思路。在Javascript语言中,new命令后面跟的不是类,而是构造函数。通过构造函数实现继承,无法共享属性和方法。每一个实例,都有自己的属性和方法的副本,这会造成资源浪费。......

weixin_42936434的博客 808

JavaScript原型与原型链(基础篇)

0 前言 原型机制一直都是JavaScript的核心之一,网上有人说理解了原型机制,也就理解了JavaScript的一半精髓了。网络上关于原型的文章大多数都是围绕着“原型是什么?”“原型如何使用?”这两大核心问题的,但是对于JavaScript初学者,尤其是有C++或Java基础的JavaScript初学者来讲,很难理解另一种非类(class)的继承机制,出于这个问题,本文从语言设计者的角度,由浅入深、循序渐进的介绍JavaScript的继承机制,并引入原型的概念,希望对初学者有所帮助。 注意:了解ES6的

syzdev的博客 1779

JS篇 (二)原型、原型链和继承

2)当访问一个对象的某个属性时,会先在这个对象本身属性上找,若未找到则会通过_proto_隐式属性找到它的构造函数的原型对象。b.使用extends和super两个关键字,在子类的constructor方法中调用super,用来继承父类的this对象;b.子类所有实例共用父类属性没有自己的属性,一个实例改变了父类引用类型的值,所有实例都会改变;d.创建子类时无法向父类构造函数传参。d.实例可以继承父类实例的属性方法,也可继承原型链上的属性和方法;b.只能继承父类的实例属性和方法,不能继承父类原型上的方法;

qianmo0330的博客 647
上一篇: JS 基础篇(二):理解JS原型对象与原型链
下一篇: JS 应用篇(三):var、let、const的区别
madman0621
博客等级 码龄11年 36粉丝 52原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值