原型链以及继承的几种方式

article/2025/9/13 0:38:05

原型链以及继承的几种方式

    • 学习原型链前需要了解
    • 原型链
    • 继承的几种方式

学习原型链前需要了解

只要创建一个新函数,就会根据特定的规则为该函数创建一个 prototype 属性,这个属性是一个指针,指向一个对象。这个对象的用途是包含可以由特定类型的 所有实例 共享的属性和方法,这个对象就是通过调用构造函数创建的对象实例的原型对象。 所有的原型对象都会默认获得一个constructor(构造函数) 属性该属性指向构造函数。
当调用构造函数创建一个实例之后,该实例内部会包含一个指针(属性),指向构造函数的原型,我们可以称这个指针为 [[Prototype]]

function Person (name, age, job) {this.name = name;this.age = age;this.job = job;this.sayName = function () {alert(this.name)}
}
var person1 = new Person(“Nicholas”, 29, “Sofware Engineer”)
var person2 = new Person(“Greg”, 27, “Doctor”)alert(person1.constructor == Person) // true
alert(person2.constructor == Person) // true//创建出来的所有对象即使Object的实例,同时也是Person的实例

原型链

构造函数,原型和实例的关系
每一个构造函数都有一个原型对象,原型对象包含一个指向构造函数的指针,而每个实例都包含一个指向构造函数的原型对象的内部指针

原型链
如果让一个原型对象等于另一个类型的实例,层层递进,构成实例与原型的链条,这就是原型链

创建了自定义的构造函数,其原型对象默认只会取得 constructor 属性;其他方法都是从Object 继承来的
当调用构造函数创建一个实例之后,该实例内部会包含一个指针(属性),指向构造函数的原型,我们可以称这个指针为 [[Prototype]]

Function(Object)包含 prototype(原型对象指针)
prototype(原型对象指针)包含constructor(构造函数)属性
constructor(构造函数)属性包含指向原型对象所在函数的指针

包含
包含
包含
Function构造函数
prototype
constructorr
指向原型对象所在的构造函数

注意:
如果使用如下方式给原型赋值,则constructor属性不再指向原型对象躲在的函数,指向Object构造函数

Person.prototype = {name: '哈哈'}

继承的几种方式

js主要是通过原型链实现继承,原型链的构建是通过将一个类型的实例赋值给另外一个构造函数的原型实现的
原型链继承
基本代码

function SuperType () {this.property = true
}
SuperType.prototype.getSuperValue = function () {return this.property
}
function SubType () {this.subproperty = false
}
// 继承了SuperType //
SubType.prototype = new SuperType()
SubType.protype.getSubValue = function () {return this.subproperty
}
var instance = new SubType()

实现的本质:重写原型对象,用一个新的类型的实例去替代
在这里插入图片描述
SubType Prototype === SuperType构造函数的实例
注意:
1.默认的原型
所有的引用类型都默认继承Object,这个继承也是通过原型链实现的在这里插入图片描述
2.原型链的问题
a.对象实例共享所有继承的属性和方法
b.创建子类型的实例的时候,不能传递参数

借用构造函数继承
基本代码

function SuperType () {this.colors = ["red", "blue", "green"]
}
function SubType () {// 继承了SuperTypeSuperType.call(this)// 只能继承构造函数上的属性
}

实现的本质:在子类构造函数的内部调用超类型构造函数,使用aapply()和call() 方法
注意:
1.函数复用性不高
2.只能继承实例上的属性,原型上的方法不可见

组合继承(伪经典继承)
基本代码

function SuperType (name) {this.name = namethis.colors = ["red", "blue", "green"]
}
SuperType.prototype.sayName = function () {alert(this.name)
}
function SubType (name, age) {// 继承属性SuperType.call(this, name)  // 第二次调用SuperType()this.age = age
}
//继承方法
SubType.prototype = new SuperType()  // 第一次调用 SuperType()
Subtype.prototype.sayAge = function () {alert(this.age)
}

实现思路:使用原型链实现对原型属性和方法的继承,通过借用构造函数来实现对实例属性的继承
注意:
组合继承避免了原型链和借用构造函数的缺陷,融合了他们的优点,成为js中最常用的继承方式。

原型式继承
基本代码

function object (o) {function F(){}F.prototype = oreturn new F()
}

实现本质:object()函数对传入其中的对象执行了一次浅复制
注意:
可以在不必预先定义构造函数的情况下实现继承,其本质是执行对给定对象的浅复制,而复制的副本还可以得到进一步的改造
问题还是包含引用类型的属性都会被共享

寄生式继承
基本代码

function createAnother (original) {var clone = object(original)  // 通过调用函数创建一个新对象clone.sayHi = function () {   // 以某种方式来增强这个对象alert("hi")}return clone                  // 返回这个对象
}

实现本质和寄生构造函数还有工厂模式类似
注意:
基于某个对象或者某些信息创建一个对象,然后增强对象,最后返回对象,为了解决组合继承模式由于多次调用超类型构造函数而导致的低效率问题,可以将这个模式与组合继承一起使用

寄生组合式继承
基本代码

	function inheritPrototype (subType, superType) {var prototype = object(superType.prototype)  // 创建对象prototype.constructor = subType              // 增强对象subType.prototype = prototype                // 指定对象}function SuperType (name) {this.name = namethis.colors = {"red", "blue", "green"}}SuperType.prototype.sayName = function () {alert(this.name)}function SubType (name, age) {SuperType.call(this, name)this.age = age}inheritPrototype(SubType, SuperType)

实现本质:借用构造函数来继承属性,通过原型链的混成形式来继承方法
注意:
高效率只调用了一次构造函数,集寄生式继承和组合继承的优点于一身,是实现基于类型继承的最有效方式

小结:
JavaScript主要通过原型链实现继承。原型链的构建是通过将一个类型的实例赋值给另一个构造函数的原型实现的。
使用最多的继承模式是组合继承,这种模式使用原型链继承共享的属性和方法,通过借用构造函数继承实例属性

注:博客新手,文章有误请大家指出,不胜感激
之后随笔应该会同时在CSDN和掘金上更新,下面是我的掘金主页
江湖不渡!的主页


http://chatgpt.dhexx.cn/article/3F1a79YM.shtml

相关文章

深入JS原型、原型链和继承

文章目录 一、原型的理解1.对象的原型2.函数的原型3.constructor 二、原型链1.概念和理解2.原型链中最顶层的原型 三、继承1.原型链继承:2.借用构造函数继承: 一、原型的理解 1.对象的原型 JavaScript当中每个对象都有一个特殊的内置属性[[prototype]]…

原型链与继承

目录 原型链 继承 Javascript为什么没有方法签名? 原型链继承 构造函数继承 组合继承 原型式继承 寄生继承 寄生组合继承 原型链 原型链是一种原型对象和实例对象的关系,通过属性__proto__进行联系。 继承 继承是一种允许我们在已有的类的基…

JS原型链和继承

JS原型链和继承 认识对象的原型 [[Get]]:JS的存取描述符——get方法,在获取对象属性时会自动调用 JavaScript当中每个对象都有一个特殊的内置属性[[prototype]],这个特殊的属性指向另外一个对象 [[prototype]]指向的对象: 当我…

JS原型链继承

再讲述JS原型链继承之前,我希望大家能够先理解 《函数,函数原型和函数实例之间的关系》,这样有助于大家理解JS原型链继承的原理,下面先看一张图吧,咱们看图说话: 如果大家看完了 《函数,函数原型和函数实…

原型链和继承的六种实现方式

一省:HTML 12. img标签的alt和title有什么不同? alt: 当图片加载不出来的时候,就会在图片未显示的地方出现一段 alt 设置的属性内容。浏览器的搜索引擎可以通过 alt 属性的文字描述来获取图片。 title: title是鼠…

原型,原型链,原型的继承

原型的作用? 1.节省内存空间 2.实现数据共享(继承) 什么是原型? 任何一个函数都有propotype属性,它本身是一个对象,我们称之为原型 构造函数,实例化对象与原型之间的关系? 1.任何一个函数都有prototype属性,它本身是一个对象,我们称之为原型 2.构造函数也是函数,也都…

JS原型、原型链和7种继承方法【白话文讲解】

前言 在学习JS原型、原型链和继承之前,我们必须先弄懂三个W,也就是我们常说的“学习三问” 学习三问: 1.它是什么?(What) 2. 为什么用它?(Why) 3. 什么时候用它&#xff…

原型链与常用继承方法

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

如何用原型链的方式实现一个 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架构编写…