JS继承详解

2023-05-16

JS继承主要有以下几种:

1.原型链继承:将父类的实例作为子类的原型

function Parent() {
   this.isShow = true
   this.info = {
      name: "yhd",
      age: 18,
   };
}

Parent.prototype.getInfo = function() {
   console.log(this.info);
   console.log(this.isShow); // true
}

function Child() {};
// 最关键的一行
Child.prototype = new Parent();

2.构造函数继承:通过在子类构造函数中调用父类构造函数,可以在子类构造函数中使用call()apply()方法。

function Parent() {
  this.info = {
    name: "yhd",
    age: 19,
  }
}

function Child() {
// 通过 call 方法将 child构造函数调用时产生的实例对象作为parent的函数上下文
,因此继承了parent的引用属性info。
    Parent.call(this)
}

let child1 = new Child();
child1.info.gender = "男";
console.log(child1.info); // {name: "yhd", age: 19, gender: "男"};

let child2 = new Child();
console.log(child2.info); // {name: "yhd", age: 19}

通过使用这两个方法,Parent构造函数在 new 一个 child 实例对象的上下文中执行了,就相当于新创建的实例对象运行了 Parent()函数中的所有初始化代码,结果就是每个实例都有自己的info属性。

优点:对比原型链继承,构造函数继承的一个优点是子类构造函数可以向父类构造函数传参;父类的的引用属性不会被共享

缺点:子类不能访问父类原型上的方法,(即不能访问Parent.prototype上定义的方法),因此所有方法属性都写在构造函数中,每次创建实例都会初始化

function Parent(name) {
    this.info = { name: name };
}
function Child(name) {
    //继承自Parent,并传参
    Parent.call(this, name);
    
     //实例属性
    this.age = 18
}

let child1 = new Child("yhd");
console.log(child1.info.name); // "yhd"
console.log(child1.age); // 18

上面实例中得知,父类构造函数Parent接受到一个参数name,并将它赋值给属性name,在Child构造函数中调用 Parent构造函数时传入这个参数,实际上会在Child实例上定义name属性。

3.组合继承

结合原型链继承和构造函数继承的优点:基本思路是使用原型链继承原型上的属性和方法,使用构造函数继承实例属性。

function Parent(name) {
   this.name = name
   this.colors = ["red", "blue", "yellow"]
}
Parent.prototype.sayName = function () {
   console.log(this.name);
}

function Child(name, age) {
   // 继承父类属性
   Parent.call(this, name)
   this.age = age;
}
// 继承父类方法
Child.prototype = new Parent();

Child.prototype.sayAge = function () {
   console.log(this.age);
}

let child1 = new Child("yhd", 19);
child1.colors.push("pink");
console.log(child1.colors); // ["red", "blue", "yellow", "pink"]
child1.sayAge(); // 19
child1.sayName(); // "yhd"

let child2 = new Child("wxb", 30);
console.log(child2.colors);  // ["red", "blue", "yellow"]
child2.sayAge(); // 30
child2.sayName(); // "wxb"

从上面的例子可知,Parent构造函数定义了两个属性name和colors,然后在他的原型上定义了sayName()方法,Child 构造函数内部调用了 Parent 构造函数,同时传入了参数name,同时Child.prototype也被赋值为Parent实例,然后又在他的原型上添加了个sayAge()方法。

这样就创建了两个实例child1 child2,让两个实例都有自己的属性,而且还共享了父类的sayName方法。

总结:组合类继承的优点有三个,父类的方法可以共用、父类构造函数的引用属性不会共享、子类构造函数可以传参。

4.原型式继承

对参数对象的一种浅复制

// 在普通函数里面调用构造函数创建一个实例对象,并将被复制对象作为参数,赋值给这个实例对象,
从而实现继承
function objectCopy(obj) {
  function Fun() { };
  Fun.prototype = obj;
  return new Fun()
}

let person = {
  name: "yhd",
  age: 18,
  friends: ["jack", "tom", "rose"],
  sayName:function() {
    console.log(this.name);
  }
}

let person1 = objectCopy(person);
person1.name = "wxb";
person1.friends.push("lily");
person1.sayName(); // wxb

let person2 = objectCopy(person);
person2.name = "gsr";
person2.friends.push("kobe");
person2.sayName(); // "gsr"

console.log(person.friends); // ["jack", "tom", "rose", "lily", "kobe"]

缺点:父类的引用属性会被共享(例子中的friends)、子类不能向父类传参。

5.寄生式继承

使用原型式继承实现对目标对象的浅复制,同时增强浅复制的能力

function objectCopy(obj) {
  function Fun() { };
  Fun.prototype = obj;
  return new Fun();
}

function createAnother(original) {
  let clone = objectCopy(original);
  clone.getName = function () {
    console.log(this.name);
  };
  return clone;
}

let person = {
     name: "yhd",
     friends: ["rose", "tom", "jack"]
}

let person1 = createAnother(person);
person1.friends.push("lily");
console.log(person1.friends); // ["rose", "tom", "jack", "lily"]
person1.getName(); // yhd

let person2 = createAnother(person);
console.log(person2.friends); // ["rose", "tom", "jack", "lily"]

6.寄生式组合继承(是引用类型继承的最佳模式 )

function objectCopy(obj) {
  function Fun() { };
  Fun.prototype = obj;
  return new Fun();
}

function inheritPrototype(child, parent) {
  let prototype = objectCopy(parent.prototype); // 创建对象

  // 这两行代码形成闭环,prototype上的属性constructor指向child构造函数,child构造函数
  上的属性prototype 指向它的原型prototype对象

  prototype.constructor = child; // 增强对象
  Child.prototype = prototype; // 赋值对象
}

function Parent(name) {
  this.name = name;
  this.friends = ["rose", "lily", "tom"]
}

Parent.prototype.sayName = function () {
  console.log(this.name);
}

function Child(name, age) {
  Parent.call(this, name);
  this.age = age;
}

//与组合继承的区别在于这一句代码
inheritPrototype(Child, Parent);

// 在组合式继承中,是继承父类方法
// Child.prototype = new Parent();

Child.prototype.sayAge = function () {
  console.log(this.age);
}

let child1 = new Child("yhd", 23);
child1.sayAge(); // 23
child1.sayName(); // yhd
child1.friends.push("jack");
console.log(child1.friends); // ["rose", "lily", "tom", "jack"]

let child2 = new Child("yl", 22)
child2.sayAge(); // 22
child2.sayName(); // yl
console.log(child2.friends); // ["rose", "lily", "tom"]

优点:

  1. 父类的方法可以复用

  2. 可以在Child构造函数中向Parent构造函数中传参

  3. 父类构造函数中的引用属性不会被共享

  4. 只调用一次构造函数

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JS继承详解 的相关文章

  • Java 判断实体类属性是否为空工具类

    2019独角兽企业重金招聘Python工程师标准 gt gt gt import org apache commons lang StringUtils import java lang reflect Field import java
  • TLS Error: TLS handshake failed解决办法

    直接修改端口号 服务器端和客服端都要改哟 转载于 https blog 51cto com luoguoling 1080298
  • windows禁用rc4 算法

    公司的Windows服务器被扫描出安全漏洞 SSL TLS 受诫礼 BAR MITZVAH 漏洞 CVE 2015 2808 和安全厂家沟通 xff0c 漏洞是由rc4算法 xff0c 引起的 xff01 把服务里面的rc4算法禁用就行了
  • iOS 抓取 UIwebview 上 所有 图片 并进行滚动播放

    关于在UIwebview上添加滚动图片 两种滚动手势会混淆 xff0c 应为webview有webview scrollview的属性 故参照昨天的随笔 scrollview嵌套解决方案 本篇随笔主要讲循环使用正则表达式 xff0c 本人在
  • 优化网络爬虫

    Date 2019 07 03 Author Sun 优化之前的网络爬虫代码如下 xff1a code coding utf 8 author 61 39 sun 39 date 61 39 2019 7 3 上午10 53 39 from
  • 如何使用SendMessage发送按键组合,例如:Ctrl+A

    代码 var hwnd Integer begin hwnd 61 FindWindow 39 Notepad 39 nil SetForegroundWindow hwnd keybd event VK CONTROL MapVirtua
  • 算法题:按规律输出

    编写算法 xff1a 打印具有下面规律的图形 1 5 2 8 6 3 10 9 7 4 输入 xff1a 手动输入n 输出 xff1a 格式输出n行 思路 xff1a 1 定义100x100的二维数组并给其赋值 a30a31a32a33a2
  • Python聚类色彩提取——Scipy-kmeans

    一 聚类 xff1a 物以类聚 数组可以进行聚类 xff0c 并找到数组的聚类中心 使用的第三方库是scipy xff0c 需要pip install scipy xff0c 先安装该库 数组聚类代码 xff1a import numpy
  • 推荐 3 款实用 Node.js 版本管理工具

    为了能够对 Node js 版本进行版本管理 xff0c 我整理了 3 款非常实用的 Node js 版本管理工具 xff0c 让大家能够自由地切换本地环境不同的 Node js 版本 1 nvm Github stars 60K 43 n
  • ipv6 neutron应用(一)

    一 neutron支持ipv6 xff0c 有2个重要的属性 1 ipv6 ra mode 2 ipv6 address mode 这2个属性都可以设置下面三个值 1 slaac 2 dhcpv6 stateful 3 dhcpv6 sta
  • 理解Compressed Sparse Column Format (CSC)

    最近在看 Spark for Data Science 这本书 xff0c 阅读到 Machine Learning 这一节的时候被稀疏矩阵的存储格式CSC给弄的晕头转向的 所以专门写一篇文章记录一下我对这种格式的理解 目的 Compres
  • FBOSS

    https github com facebook fboss
  • 五款针对Ubuntu系统的最佳杀毒软件

    随着使用 Linux 作为主要桌面的用户越来越多 xff0c 很多黑手都伸向了这部分用户 虽然目前专门针对 Linux 的专有恶意软件还比较少 xff0c 但大家还是需要保持相当的谨慎才是才策 由于大部分 Linux 新手用户中 Ubunt
  • 解决www.github.com访问太慢的问题

    解决www github com访问太慢的问题 使用www github com的过程中 xff0c 有时候打开会特别的慢 xff0c 原因github com的域名被一堵伟大的墙挡在了外面 但是我们可以通过修改本机的hosts文件来修改这
  • 国内有哪些好的刷题网站?

    http www zhihu com question 25574458 Luau Lawrence xff0c Data Mining 弱鸡 PhD 64 NTU 温梦强 石一帆 知乎用户 等人赞同 Welcome To PKU Judg
  • 使用update命令来修改Mysql的root密码

    1 xff0c 使用update命令来修改Mysql的root密码 使用Mysql update命令既可以修改root的老密码 xff0c 也可设置root的密码为空 xff0c 如果使用update命令更改root的密码 xff0c 需要
  • 设置 java -jar 的进程显示名称

    有时候我们会用 nohup java jar xxx jar 来将一些可执行的java application挂在后台 xff0c 类似windows服务一样来运行 但是有一个不爽的地方 xff0c 在linux终端里用jps 显示时 xf
  • linux下修改hostid

    linux下修改hostid 网上有很多版本 xff0c 总结了这几点 1 gt 一个以16进制显示的int字符串 xff1b 2 gt 配置文件 etc hostid 如果有值 xff0c 输出 xff0c 结束 3 gt 从hostna
  • 21分钟学会写编译器

    本文来自网易云社区 知乎上有一种说法是 编译器 图形学 操作系统是程序员的三大浪漫 先不管这个说法是对是错 xff0c 我们假设一个程序员在国内互联网公司写代码 xff0c 业余时间不看相关书籍 那么三年之后 xff0c 他的这些知识会比在
  • 解决idea打包出现中文乱码的问题

    这主要是maven编译时编码问题导致的 在Intellij的settings中maven的runner配置中将原有的配置 DarchetypeCatalog 61 internal修改设置它的VM Options为 DarchetypeCa

随机推荐

  • 局部使用element-ui自定义主题实践

    背景 内部系统虽然使用了element ui xff0c 但同时又混杂了多种风格的样式和各自写的通用组件 xff0c 在参与新功能开发时 xff0c 产品经理的设计需要以绿色为主题色 xff0c 看到element官网有个自定义主题 xff
  • windows server 2012 R2 远程桌面授权模式尚未配置

    windows server 2012 R2 远程桌面授权模式尚未配置 xff0c 远程桌面服务将在120天内停止工作 如何破解这个宽限期 xff0c 目前企业7位协议号码均不包含2012 R2以上授权 那么只能蛋疼的 破解 咯 解决方法
  • LPAD

    语法 span class pln style color rgb 0 0 0 VARCHAR LPAD span span class pun style color rgb 102 102 0 span span class pln s
  • Python 之 sqlalchemy更新数据

    表结构 xff1a 代码 xff1a Author Kang import sqlalchemy from sqlalchemy import create engine from sqlalchemy ext declarative im
  • php curl 设置请求头headers和请求体body

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 啥也不说 xff0c 直接上代码 我这里是post请求 url 61 34 http www example com 34 headers数组内的格式 headers 61
  • 华为路由器双出口负载均衡+备份

    一个网段内 xff0c IP地址 xff08 末位奇数 xff09 走电信 xff0c IP地址 xff08 末位偶数 xff09 走联通 当某个运营商不可达时 xff0c 自动切换 通过NQA来确定运营商是否可达 xff0c 并与流行为
  • office2013VOL版下载资源链接

    office2013VOL版下载资源链接 软件名称 xff1a office2013VOL软件大小 xff1a 914 5 810 7 713 3 801 2 M 软件语言 xff1a 简中软件性质 xff1a 免费 xff08 需要mak
  • 使用 TRY/CATCH 语句解决 SQL Server 2005 死锁

    对于今天的 RDBMS 体系结构而言 xff0c 死锁难以避免 在高容量的 OLTP 环境中更是极为普遍 正是由于 NET 的公共语言运行库 CLR 的出现 xff0c SQL Server 2005 才得以为开发人员提供一种新的错误处理方
  • delphi之找色和色块

    找色和色块 xff0c 是模拟的重要基础 有时候 xff0c 需要确定某点是否出现某种颜色 xff0c 有时候需要判断色块是否出现在某位置 有时候 xff0c 需要看范围内是否出现色块 function IsColor bmp TBitma
  • 局域网组建(二) OpenWrt作为一般节点接入WireGuard组建的跨地域局域网

    本实验将OpenWrt作为一般节点 xff08 不提供网关功能的客户端 xff09 接入WireGuard组建的跨地域局域网 xff0c 实现与局域网内其他机器的通信 由于OpenWrt也具备NAT功能 xff0c 因此OpenWrt下的设
  • 简历上如果出现过于高大上的项目,反而过犹不及:再论如何通过项目引出技术...

    我看了前几天些的博文 xff0c 分析若干没面试机会和没体现实力的简历 xff0c 就想起了做技术面试官时的一些往事 我见过有些简历 xff0c 上面列出的项目描述非常高大上 xff0c 比如用到了xx机器学习技术 xff0c 或者在一个项
  • VNC 服务器配置和调试 含 VNC同步TTY7

    RHCE 学习笔记 VNC 服务器配置和调试 服务包 xff1a Server xff1a vnc server 4 1 2 14 el5 3 1 vnc 4 1 2 14 el5 3 1 Client vnc 4 1 2 14 el5 3
  • Ubuntu pip3安装uwsgi报错

    笔者在ubuntu16 04使用pip3安装uwsgi时报错了 xff0c 报错信息如下 leslie 64 leslie TWS sudo pip3 tall uwsgi The directory 39 home leslie cach
  • (水一下)Linux启动步骤(面试题)

    1 加载并初始化Linux内核 2 配置硬件设备 3 内核创建自发进程 4 由用户决定是否进入手工引导模式 5 init进程执行系统启动脚本 6 进入多用户模式 转载于 https blog 51cto com 12942223 24086
  • 闲话过程改进和CMMI,敏捷等

    从前有一个大组织 DoD xff0c 软件开发的活很多 xff0c 自己干不了 xff0c 就找了很多小企业来帮他做 结果 xff1a 有的不能按时干完 xff0c 有的干的活太糙 xff0c 最操蛋的是有的拿了钱开始干 xff0c 该交活
  • 在linux下安装Avria(小红伞)

    1 下载AntiVir PersonalEdition Classic for linux http www free av com 2 解压 tar zxvf antivir tar gz 3 进入解压后的文件夹 sudo install
  • 各大搜索引擎提交网站的入口地址

    搜索引擎网站收录地址大全 xff1a 百度搜索网站登录口 xff1a http www baidu com search url submit html Google网站登录口 xff1a http www google com addur
  • sql乘法函数实现方式

    sql中有很多聚合函数 xff0c 例如 COUNT SUM MIN 和 MAX 但是唯独没有乘法函数 xff0c 而很多朋友开发中缺需要用到这种函数 xff0c 今天告诉大家一个不错的解决方案 logx 43 logy 61 logx y
  • 如何查看linux中的ssh端口开启状态

    netstat anp grep 22 netstat anp grep ssh lsof i 22
  • JS继承详解

    JS继承主要有以下几种 xff1a 1 原型链继承 xff1a 将父类的实例作为子类的原型 function Parent this isShow 61 true this info 61 name 34 yhd 34 age 18 Par