原型链与常用继承方法

article/2025/9/13 1:22:47

原型链:当访问一个对象的属性时,如果该对象内部不存在这个属性,就会去该对象的__proto__ 上(也就是它构造函数的prototype)查找 。该构造函数的prototype上也有一个自己的__proto__ 属性,然后继续向上查找, 直到__proto__为null,就停止查找。

let date = new Date()
console.log(date.__proto__ === Date.prototype); //true
console.log(date.__proto__.constructor === Date); //true
console.log(date.__proto__.__proto__ === Date.prototype.__proto__); //true
console.log(Date.prototype.__proto__.constructor === Object); //true
console.log(Date.prototype.__proto__ === Object.prototype); //true
console.log(Object.prototype.__proto__ === null); //true

封装:将公用的方法或者组件进行封装,达到代码复用,让我们的代码更简洁
继承:子类继承父类中的实例和方法
多态:不同对象作用于同一操作产生不同的效果

1.原型链继承

特点:继承父类原型上的属性和方法。
缺点:创建子类实例时,不能向父类构造函数中传参数,无法实现多继承

//父类
function Person(name) {this.name = name;this.sleep = function(){console.log(this.name + '正在睡觉')}
}
Person.prototype.change = "123木头人"
Person.prototype.sayHi = function () {console.log("您好啊!");
};
//子类
function Child(age) {this.age = age
}
Child.prototype = new Person()
Child.prototype.constructor = Child
let child = new Child(10)
console.dir(child)

原型链继承

2.构造函数继承

特点:解决了子类构造函数向父类构造函数中传递参数,可以实现多继承(call或者apply多个父类)
缺点:方法都在构造函数中定义,无法复用,不能继承原型上的属性和方法

//父类
function Person(name) {this.name = name;this.sleep = function(){console.log(this.name + '正在睡觉')}
}
Person.prototype.change = "123木头人"
Person.prototype.sayHi = function () {console.log("您好啊!");
};
//子类
function Child(name,age) {Person.call(this, name) // Person.apply(this, [name]) //=> apply后面的参数是个数组.this.age = age;
}
let child = new Child("校长",10)
console.dir(child)

构造函数继承

3.组合继承

特点:把1和2的方法相结合,函数可以复用,可以继承属性和方法,并且可以继承原型的属性和方法
缺点:会挂载两次父类的属性和方法(有两个name和sleep),产生小bug,

//父类
function Person(name) {this.name = name;this.sleep = function(){console.log(this.name + '正在睡觉')}
}
Person.prototype.change = "123木头人"
Person.prototype.sayHi = function () {console.log("您好啊!");
};
//子类
function Child(name,age) {Person.call(this, name) // Person.apply(this, [name]) //=> apply后面的参数是个数组.this.age = age;
}
Child.prototype = new Person()
Child.prototype.constructor = Child
let child = new Child("校长",10)
console.dir(child)

组合继承

4.寄生组合继承

特点:通过寄生的方式来修复组合式继承的不足,完美的实现继承。
Object.create()方法创建一个空对象,让属性和方法继承到对象的__proto__上

//父类
function Person(name) {this.name = name;this.sleep = function(){console.log(this.name + '正在睡觉')}
}
Person.prototype.change = "123木头人"
Person.prototype.sayHi = function () {console.log("您好啊!");
};
//子类
function Child(name,age) {Person.call(this, name) // Person.apply(this, [name]) //=> apply后面的参数是个数组.this.age = age;
}
Child.prototype = Object.create(Person.prototype)
Child.prototype.constructor = Child
let child = new Child("校长",10)
console.dir(child)

寄生组合继承

5.ES6 class extend继承

//class 相当于es5中构造函数
//class中定义方法时,前后不能加function,全部定义在class的protopyte属性中
//class中定义的所有方法是不可枚举的
//class中只能定义方法,不能定义对象,变量等
//class和方法内默认都是严格模式
//es5中constructor为隐式属性
class People {constructor(name, age) {this.name = name;this.age = age;}sleep() {console.log(`${this.name} ${this.age} 正在睡觉`)}
}
//继承父类
class Child extends People {constructor(name, age) {//继承父类属性super(name, age);}sleep() {console.log(this);//继承父类方法super.sleep()}
} 
let child = new Child('小红',18); 
console.log(child);
child.sleep();    //小红 18 正在睡觉

总结:ES5继承和ES6继承的区别

ES5的继承实质上是先创建子类的实例对象,然后再将父类的方法添加到this上(Parent.call(this)).
ES6的继承有所不同,实质上是先创建父类的实例对象this,然后再用子类的构造函数修改this。因为子类没有自己的this对象,所以必须先调用父类的super()方法,否则新建实例报错。


http://chatgpt.dhexx.cn/article/GY6E1HbO.shtml

相关文章

如何用原型链的方式实现一个 JS 继承?

大家好,我是前端西瓜哥。今天讲一道经典的原型链面试题。 原型链是什么? JavaScript 中,每当创建一个对象,都会给这个对象提供一个内置对象 [[Prototype]] 。这个对象就是原型对象,[[Prototype]] 的层层嵌套就形成了…

JS学习笔记 原型链和利用原型实现继承

原型链 原型链是一种关系,实例对象和原型对象之间的关系,关系是通过原型(__proto__)来联系的 实例对象中有__proto__,是对象,叫原型,不是标准的属性,浏览器使用,并且有的游览器不支持构造函数中有prototype属性,也是对象,叫原型 注意 原型中的方法是可…

Arduino基本知识(marlin固件配置)

初识arduino,根据mega2560(某宝可以买到)官网的100个管脚具体控制一句传输进行操作。 https://www.arduino.cc/en/Hacking/PinMapping2560 其管脚图如上所示。 首先在官网下载arduino的配套软件 https://www.arduino.cc/ 对于编程&#xf…

3D打印机硬件驱动-马林固件最新版本2.0.X中文注释(3)marlin 2.0.9.2 截至发稿时间2021年12月16日

/** * Marlin 3D Printer Firmware 头描述详见其他两个文件头描述 * Copyright (c) 2020 MarlinFirmware [https://github.com/MarlinFirmware/Marlin] * * Based on Sprinter and grbl. * Copyright (c) 2011 Camiel Gubbels / Erik van der Zalm * * This program is…

Marlin固件配置

文档来源自http://www.geek-workshop.com/thread-33314-1-1.html 1、基本配置基本配置是可选的,主要是给你的固件起个名字,如果你的配置很牛,让大家知道你是谁。据说这个在启动的时候会显示在显示屏中,应为我没有显示屏,所以无法验证。这个修改也很简单,通过搜索找到“S…

MKS MONSTER8 V1.0使用说明书(基于Marlin 2.0.X固件配置Voron 2.4)

广州谦辉信息科技有限公司 (基于Marlin 2.0.x 固件配置 Voron 2.4) 创客基地QQ群:489095605 232237692 邮箱:Huangkaidamakerbase.com.cn 主板购买链接:https://item.taobao.com/item.htm?spma1z10.5-c-s.w4002-23356668283.43.7eec55caLT…

ESP32烧录Marlin固件

安装platformIO 这点很简单,保证你拥有一个能够成功连接外网的环境即可。内网可能不太稳定有可能安装失败。 克隆代码 我这里采用的是fyset_e4的代码,这个代码开源在了https://github.com/FYSETC/FYSETC-E4,作者已经针对marlin固件做了一些配置。 更改…

i3型3D打印机制作详解——Marlin固件中文介绍

关注微信公众号:嵌入式基地 后台回复:3d打印机 获取资料 硬件框架搭建介绍 https://blog.csdn.net/qq_39020934/article/details/80380250 Marlin固件中文介绍 https://download.csdn.net/download/qq_39020934/10401251 …

3D打印机Marlin固件双Z轴设置

3D打印机Marlin固件双Z轴设置 在3D打印机Marlin固件的最新版本2.1.1中,设置双Z轴和老版本有一些改动。记录一下如何在最新版本的Marlin固件中设置双Z轴。 以MKS GEN_L V2.1的主板为例,硬件连接还是和原来一样,第二个Z轴的电动机连接到空闲的…

Marlin 固件配置手动退换料

换料的步骤首先把喷头加热,软化喷嘴里残余的线材,然后反转挤出机,把线材抽出来。最后装入新线材,并挤出余留在喷头里的材料。整个过程用一个命令 M600 就能完成。默认情况下 Marlin 固件并没有开启这个功能,但是可以修…

MKS_SGEN_L V1.0 marlin 固件编译

1.下载 Visual Studio Code 打开Visual Studio Code 安装插件 在应用商店搜索下载安装如下图: 安装完这些还是不行的 还要另外安装python 3.8.8 其他版本python 不行右下角会报错,提示安装python 3.8 python 3.8.8 百度网盘下载链接:https://pan.bai…

3D打印机硬件驱动-马林固件最新版本2.0.X中文注释(1)marlin 2.0.9.2 截至发稿时间2021年12月16日

马林固件最新版本翻译注释 /* Marlin Firmware 马林固件 (c) 2011-2020 MarlinFirmware Portions of Marlin are (c) by their respective authors. 马林部分程序来源于世界各地的开发者 All code complies with GPLv2 and/or GPLv3 所有源码依靠GPLv2 和 GPLv3架构编写…

Marlin固件学习总结(一)

接触过3D打印也有一段时间了,一直没有将学到的知识以文本的形式记录下来。现在也没有太多时间继续玩这个了,因此想慢慢把之前所接触到所学到的知识通过文本的形式记录一下,也分享给那些感兴趣的人。 既然是开篇我们先了解一下marlin固件的结构…

Marlin固件之二:源代码详解与移植

由于需要进行固件定制化,Marlin固件太过于强大和紧凑,我对这个固件进行了裁剪,只剩下主枝干,实现功能的定制和裁剪。以下的代码详解是基于我已经移植在stm32上面的一个程序进行的。

Marlin固件之—:基础入门与测试

一、Marlin的简单介绍 Marlin固件是一个3D打印的开源固件,3D打印固件有许多,Marlin最为健全和强大,当然相对也会复杂一些。使用Gcode控制爱,Gcode是数控机床等工控控制使用范围较广的一种指令协议。在这里介绍一些Marlin的入门经…

Marlin固件介绍

目录 什么是Marlin? 主要特点 Marlin如何工作 打印东西 建模 …

marlin2.0.x 固件相关配置文档说明

主要目的 了解对应参数的作用,以优化3D打印机的打印效果 具体分析 配置文件有两个 Configuration.h 包含硬件核心、语言和控制器的设置,以及最常见的功能和组件的设置,主要配置的地方。 Configuration_adv.h 提供更详细的自定义选项&…

杨辉三角形--2021蓝桥杯Java组

杨辉三角形–2021蓝桥杯Java组 题目描述 下面的图形是著名的杨辉三角形: 如果我们按从上到下、从左到右的顺序把所有数排成一列,可以得到如下数列:1,1,1,1,2,1,1,3,3,1,1,4,6,4,1,⋯ 给定一个正整数 N,请你输出数列中第一次出现…

JAVA杨辉三角形

杨辉三角形 杨辉三角形(java)首先让我们来实现要求一再来看看要求二对于要求三最后一步给三角形前面加上空格 杨辉三角形(java) 首先让我们来看看杨辉三角形的结构: 要求一:有一个数第二层有两个数要求二:每一层第一个跟最后一个数字都是一**要求三:除了数字一以外其他数字等于…

汉罗塔问题和杨辉三角(java实现)

汉罗塔问题和杨辉三角问题 汉罗塔思路分析:代码: 杨辉三角思路分析代码 汉罗塔 相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺…