js继承的几种方式

[DA45] 使用PageRank算法分析希拉里邮件中的人物关系 一. 相关知识 (一) PageRank算法 PageRank 算法是 google 公司的创始人拉里·佩奇和谢尔·盖布林于1998年提出的网页搜索优化算法. 详细内容请见百度百科:google pagerank. 如果你了解了该算法, 就能明白上一段的超链接从本页面链出, 链入百度百科的 PageRank 算法页面增加了该页面... 阅读详情

JS中的继承(上).md
JS中的继承(下).md

  1. 原型链继承
// 父类
function Person() {}

// 子类
function Student(){}

// 继承
Student.prototype = new Person()

我画张图就很容易理解了, (画错了, 最下边两个应该是Student实例)
在这里插入图片描述

缺点, 共享prototype上的属性,如果是引用类型, 就会造成多个实例共享该属性, GG

  1. 构造函数继承
// 父类
function Person(name) {
  this.say = function() {}    // 改动的代码
}
// 子类
function Student(name){
    Person.call(this,name)
}

在Student中调用父类构造函数, 因为父类前面没有用new, 所以只是简单执行, 然后把this指向了student实例, 相当于

// 父类
function Person(name) {
  this.say = function() {}    // 改动的代码
}
// 子类
function Student(name){
    this.say = function() {}    // 父类构造函数里面的代码
}

所以该模式叫借用构造函数模式
缺点:每实例化一个子类, 就要执行一次父类的构造函数, 所以子类所有实例上相同的属性都是拷贝值

  1. 组合继承
// 父类
function Person() {
  this.hobbies = ['music','reading']
}
// 父类函数
Person.prototype.say = function() {console.log('I am a person')}
// 子类
function Student(){
    Person.call(this)             // 构造函数继承(继承属性)
}
// 继承
Student.prototype = new Person()  // 原型链继承(继承方法)

缺点: 父类构造函数里面的代码会执行2遍
把共享方法挂在父类构造函数里, 方便拷贝值而不互相影响, 把共享方法定义在父类构造函数上, 用原型方式继承

  1. 原型式继承
    该方式其实是根据一个已有的实例去继承, 将该实例或该实例的原型作为原型
function clone (proto) {
    function F () {}
    F.prototype = proto
    return new F()
}

function Parent(){
	this.arr = [1,2,3]
}

let obj = new Parent()

let aa = clone(obj)
let bb = clone(obj)

aa.length = 4
console.log(bb.arr) // [1,2,3,undefined]

看图,
参数可以传入一个对象, 相当于情况1, 情况1跟原型链继承是类似的
如果传入的是原型对象, 相当于情况2, Object.create(xx.prototype)

缺点, 也会造成引用属性共享
在这里插入图片描述
5. 寄生式继承
寄生式继承其实就是在原型式继承的基础上,做了一些增强.
跟构造函数模式一样, 实例对象的引用类型属性无法共享, say方法会在每个实例上创建一次

function cloneAndStrengthen(proto){
    function F () {}
    F.prototype = proto
    let f = new F()
    f.say = function() { 
        console.log('I am a person')
    }
    return f
}
  1. 寄生组合式继承
    寄生组合式继承就是为了降低组合模式中, 调用父类构造函数的开销而出现的

其背后的基本思路是: 不必为了指定子类型的原型而调用超类型的构造函数

寄生组合式到底有什么优点?为什么要新建一个F函数, 再创建F的实例?先看图:
在这里插入图片描述
回想组合式继承, 会执行两次父类构造函数
第一次是将子类的原型指向父类的实例
第二次是子类实例化的时候, 借用了父类的构造函数

寄生组合为什么要新建一个F构造函数,再将Child的原型指向F实例?
个人理解继承组合和组合继承有不同的使用场景, 在于组合继承,子类会带有父类构造函数中this给的方法、属性, 而寄生组合继承, 拿的是F的实例,而F和Parent不同在于F是个空函数

function inherit(sub, super){
    let prototype = clone(super.prototype)
    // function F () {}
    // F.prototype = proto
    // return new F()
    prototype.constructor = sub    
    sub.prototype = prototype      
}
2026AI漫剧放心大胆做!小白也能轻松出片(附保姆级教程) 要是在2025,我大概率会劝他再等等,毕竟那时工具还没这么顺手。但到了2026年的今天,我的回答得很干脆:放心去做,绝对没问题。这一年多来,AI漫剧这块的变化真可谓翻天覆地。过去你想拍个像样的短片,哪怕再简陋,也得凑齐拍摄设备、找场地、找演员,后期剪辑更是折磨。但现在,时代变了,AI已经把创作的门槛踏平了。你不需要请演员,也不用操心灯光布景,更不用为剪辑特效烧钱。一个人,一台电脑,花几天时间就能做一部完整的AI漫剧。你只要有有想表达的故事,突发的灵感,剩下的,都能直接交给AI落地。 阅读详情

相关推荐

RISC-V— 架构基础知识学习

蜂鸟 E200 系列是一个开源的RISC-V 处理器。蜂鸟 E200 系列由中国大陆研发团队开发,用户能够轻松与开发人员取得交流和支持。RI蜂鸟 E200 处理器研发团队拥有在国际一流公司多年开发处理器的经验,使用稳健的Verilog 2001 语法编写的可综合 RTL 代码,以工业级标准进行开发。蜂鸟 E200 的代码为人工编写,添加丰富的注释且可读性强,非常易于理解。

deilt 1万+

解决 JS 对象中继承性问题之方式一:通过原型链继承来解决继承问题

Ⅰ、继承问题: 1、什么是继承? 答:子类去继承父类的东西,称之为继承; 如:子类继承父类的属性或方法等; 2、常见的继承方式有哪些? 答:继承方式有五种: 其一、原型链继承; 其二、构造函数继承(也称 call 继承); 其三、拷贝继承; 其四、组合继承(某一种或多种继承方式的组合); 其五、寄生式组合继承; Ⅱ、五大继承的优缺点: 1、原型链继承的优缺点: 其一、优点: A、实现相对简单; B、通过子类实例可以直接访问父类原型链上和实例上的成员(即:实现了继承); 其二、缺点: A、子类实例修改引用类型

狮子座的男孩 513

三大主流交易接口实战指南:XTP、CTP与数字货币API的实盘接入解析

本文深入解析了量化交易系统实现实盘交易的关键环节,聚焦于三大主流交易接口的实战接入。详细介绍了证券领域的XTP、期货领域的CTP以及数字货币交易所API的核心特性、代码封装要点与风控实践,并提供了多市场接口整合的统一架构方案,为开发者打通量化交易的“最后一公里”提供了一份接地气的实战指南。

win55的博客 1376

JS实现继承的方法

方法一:借助call function Parent (sex) { this.name = 'zxx' this.sex = sex } Parent.prototype.test = function () { console.log('我是函数') } Parent.prototype.why = 'not' function Child (sex) { ...

wfly blog 441

AI 编程助手新玩法:用 Claude Code 一键调用国产大模型(DeepSeek/Kimi/GLM 对比)

本文深入评测了Claude Code与三大国产大模型(DeepSeek、Kimi、智谱GLM)的集成效果,详细对比了它们在代码生成质量、响应速度和特殊场景支持度等方面的差异。通过实测数据和实战技巧,帮助开发者选择最适合的AI编程助手组合,提升开发效率。

weixin_30955617的博客 487

RTAB-map:实时高效的SLAM库

Real‐time appearance‐based mapping (RTAB‐Map)是一种基于外观的闭环检测方法,具有良好的内存管理,以满足处理大场景和在线长周期管理要求。RTAB‐Map集成了视觉和激光雷达SLAM方案,并支持目前绝大多数的传感器 是一个强大的、开源的Simultaneous Localization and Mapping(SLAM)库,专为机器人和无人驾驶领域设计。它提供了一套完整的解决方案,用于构建三维地图,并在未知环境中进行实时定位与导航。 github项目地址 RTAB-

weixin_45761399的博客 1万+

JS的几种继承方式

JS的几种继承方式

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

SillyTavern与Claude Code API集成:从零搭建AI聊天酒馆的完整指南

本文提供了一份从零搭建SillyTavern AI聊天前端的完整指南,重点讲解如何将其与Claude Code API集成。内容涵盖Node.js环境准备、SillyTavern部署、OpenAI兼容格式的API配置、模型选择与参数调校,以及角色扮演、扩展功能等高级玩法,帮助用户打造本地化、可定制的专属AI聊天体验。

assembly8low的博客 2612

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

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

weixin_32224199的博客 126

GhidrAssist:AI驱动的逆向工程助手实战指南

逆向工程是分析软件内部工作原理、理解二进制代码逻辑的关键技术,广泛应用于软件安全、恶意代码分析和漏洞挖掘等领域。其核心原理在于通过反编译、控制流与数据流分析等手段,将机器码还原为可理解的高级语言表示。传统逆向分析高度依赖人工经验,面对海量代码时效率低下且易出错。随着大语言模型(LLM)技术的发展,其强大的代码理解与推理能力为自动化逆向分析提供了新的可能。通过将LLM与成熟的逆向工程框架(如Ghidra)相结合,可以构建智能辅助系统,实现代码意图的自动解释、变量/函数的智能重命名以及潜在漏洞模式的辅助识别,从

weixin_42547335的博客 596

UFS 3.1协议分析(第五章) -- UFS协议栈

ContentsUFS顶层架构应用层UFS命令集UFS 设备管理器UFS任务管理器传输层互连层 UFS顶层架构     UFS基于SCSI SAM架构模型定义了一个完整的协议栈,从上到下依次为应用层、传输层、数据链路层、物理层。UFS使用MIPI联盟的UniPro作为数据链路层和MIPI的M-PHY作为物理层,两者合起来称之为互连层(UFS InterConnect Layer) 应用层     应用层包括UFS命令集、设备管

Frank_sample的专栏 7371

js继承的几种实现方式

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

A-Select ° 3130

基于MATLAB的变分模态分解(VMD)算法详解

变分模态分解(VMD)是一种先进的信号处理方法,通过变分框架将复杂信号分解为多个模态分量。相比传统经验模态分解(EMD),VMD具有坚实的数学基础,能有效抑制模态混叠和端点效应。其核心思想是将信号分解转化为约束优化问题,通过交替方向乘子法迭代求解各模态的中心频率和带宽。VMD在机械故障诊断、生物医学信号处理等领域展现出优越性能,尤其适合处理非平稳非线性信号。该算法通过严格的数学模型实现自适应频谱优化,为信号分析提供了更可靠的工具。

qq_42212808的博客 735

JavaScript实现继承的几种方式

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

codezha的博客 178

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

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

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

weixin_44786791的博客 1511

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Javascript中的几种继承方式比较

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

追 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

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

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

Yongqiang Chen的博客 636

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

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

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

weixin_44260504的博客 224

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 赋值为父类实例的方式来实现。

大华阿大华的博客 237

简单了解一下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的博客 303

JS 实现继承的几种方式

继承作为面向对象语言的三大特性之一,可以在不影响父类对象实现的情况下,使得子类对象具有父类对象的特性;同时还能再不影响父类对象行为的情况下扩展子类对象独有的特性,为编码带来了极大的便利。 下面我们就来看看 JavaScript 中都有哪些实现继承的方法。 原型链继承 原型链继承是比较常见的继承方式之一,其中涉及的构造函数、原型和实例,三者之间存在着一定的关系,即每一个构造函数都有一个原型对象,原型对象又包含一个指向构造函数的指针,而实例则包含一个原型对象的指针。 原型链继承的主要思想是:重写子类的pr.

weixin_54777359的博客 226
上一篇: 拉取github代码shell脚本
下一篇: ES6中的Symbol
飞驰的地铁
博客等级 码龄11年 13粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值