位置: IT常识 - 正文

【JavaScript】手撕前端面试题:寄生组合式继承 | 发布订阅模式 | 观察者模式(javascript中文手册)

编辑:rootadmin
【JavaScript】手撕前端面试题:寄生组合式继承 | 发布订阅模式 | 观察者模式

推荐整理分享【JavaScript】手撕前端面试题:寄生组合式继承 | 发布订阅模式 | 观察者模式(javascript中文手册),希望有所帮助,仅作参考,欢迎阅读内容。

文章相关热门搜索词:javascript手机上,javascript手机上,javascript手机版,javascript手机app,javascript 手册,javascript手机编程,javascript手机app,javascript 手册,内容如对您有帮助,希望把文章链接给更多的朋友!

🧑‍💼个人简介:大三学生,一个不甘平庸的平凡人🍬 🖥️ NodeJS专栏:Node.js从入门到精通 🖥️ 博主的前端之路(源创征文一等奖作品):前端之行,任重道远(来自大三学长的万字自述) 🖥️ TypeScript知识总结:TypeScript从入门到精通(十万字超详细知识点总结) 👉 你的一键三连是我更新的最大动力❤️!

文章目录1、寄生组合式继承要求思路代码2、发布订阅模式要求思路代码3、观察者模式要求思路代码1、寄生组合式继承要求

补全JavaScript代码,要求通过寄生组合式继承使"Chinese"构造函数继承于"Human"构造函数。要求如下:

给"Human"构造函数的原型上添加"getName"函数,该函数返回调用该函数对象的"name"属性给"Chinese"构造函数的原型上添加"getAge"函数,该函数返回调用该函数对象的"age"属性思路

寄生组合式继承是引用类型最理想的继承范式,它融合了组合式继承与寄生式继承的优点,而组合式继承又是融合了原型链和借用构造函数的技术,从而发挥两者之长,所以寄生组合式继承实际是三种技术的融合。

寄生式继承的思路是:创建一个仅用于封装继承过程的函数组合式继承的思路是:使用原型链实现对原型属性和方法的继承,而通过借用构造函数来实现对实例属性的继承。

这一题的思路是:

先创建一个inheritPrototype函数,该函数属于寄生式继承模式,作用是实现实现对原型属性和方法的继承:

// subType子类构造函数,superType父类构造函数function inheritPrototype(subType,superType){ // Object.create() 方法用于创建一个新对象,使用现有的对象来作为新创建对象的原型(prototype)。 var prototype = Object.create(superType.prototype); // 创建父类型的一个副本对象 prototype.constructor = subType; // 修复prototype的constructor subType.prototype = prototype; // 将prototype设为subType的原型 }

这里涉及到原型链的知识:一个构造函数的prototype指向它的原型对象,而它的原型对象的constructor属性又指向到这个构造函数。上面的代码中因为要让prototype设置为subType的原型,所以prototype.constructor需要指向到subType。

调用inheritPrototype后,subType就继承了superType的属性和方法,这些属性和方法存在于subType的原型上,这样一来subType的所有实例就能访问到同一个存在的属性或方法(这些属性和方法相当于是公有的)。

【JavaScript】手撕前端面试题:寄生组合式继承 | 发布订阅模式 | 观察者模式(javascript中文手册)

给"Human"构造函数的原型上添加"getName"函数:

Human.prototype.getName=function (){ return this.name;}

通过借用构造函数来实现Chinese对Human实例属性的继承:

function Chinese(name,age) {// 继承了Human,还传了参数 Human.call(this,name); // 借用构造函数模式 this.age = age; this.color = 'yellow';}

在Chinese内部调用Human构造函数,实际上是为Chinese的实例设置了Human上具有的属性和方法(不包含Human原型上的属性和方法),这样一来Chinese的所有实例就能拥有自己的属性和方法(这些属性和方法相当于是私有的)。

调用inheritPrototype(Chinese,Human); 来实现Chinese对Human原型属性和方法的继承。

给"Chinese"构造函数的原型上添加"getAge"函数:

Chinese.prototype.getAge=function(){ return this.age;}代码function inheritPrototype(subType,superType) { var prototype = Object.create(superType.prototype); prototype.constructor = subType; subType.prototype = prototype;}function Human(name) { this.name = name this.kingdom = 'animal' this.color = ['yellow', 'white', 'brown', 'black']}Human.prototype.getName = function () { return this.name;}function Chinese(name,age) { Human.call(this,name); this.age = age; this.color = 'yellow';}inheritPrototype(Chinese,Human);Chinese.prototype.getAge = function() { return this.age;}

这题寄生组合式继承涉及到了JavaScript面向对象的程序设计,需要理解对象,构造函数,原型,原型链等的知识,博主之后会出文章对JavaScript面向对象的程序设计进行讲解,敬请期待!

2、发布订阅模式要求

补全JavaScript代码,完成"EventEmitter"类实现发布订阅模式。

注意:

同一名称事件可能有多个不同的执行函数通过"on"函数添加事件通过"emit"函数触发事件思路因为同一名称事件可能有多个不同的执行函数,所以我们需要先定义一个handler对象用来保存订阅事件的列表,对象内的key为订阅事件名称,value是一个包含该订阅事件所有的执行函数的数组。on函数接收两个参数,分别代表订阅事件名称和执行函数,在on函数内判断handler对象内是否存在该订阅事件,从而决定是向handler对象内初始化该订阅事件还是向该订阅事件的函数列表中添加新函数。emit函数接收多个参数,第一个参数代表订阅事件名称,后面的参数是需要向订阅事件处理函数传递的参数,handler对象内存在该订阅事件时就遍历执行该订阅事件的函数列表数组中的所有处理函数。代码class EventEmitter { // 补全代码 constructor() { this.handler = {}; // 保存订阅事件的列表 } on(type, fn) { const fnArr = this.handler[type]; if (fnArr) { // 如果订阅事件存在,存放订阅事件的回调函数 fnArr.push(fn); } else { // 如果订阅事件不存在,则初始化该事件 // 因为同一名称事件可能有多个不同的执行函数,所以用数组来存放所有的执行函数 this.handler[type] = [fn]; } } emit(type, ...args) { const fnArr = this.handler[type]; if (fnArr) { // 如果订阅事件存在,遍历并执行订阅事件的处理函数 fnArr.forEach(cb => cb(...args)) } }}

测试:

let sign1 = 0;let sign2 = 0;const emitter = new EventEmitter();emitter.on('add', function () { sign1++ });emitter.emit('add');emitter.on('add', function () { sign2++ });emitter.emit('add');const judge = sign1 === 2 && sign2 === 1;console.log(judge); // true3、观察者模式要求

补全JavaScript代码,完成"Observer"、"Observerd"类实现观察者模式。

要求如下:

被观察者构造函数需要包含"name"属性和"state"属性且"state"初始值为"走路"。被观察者创建"setObserver"函数用于保存观察者们。被观察者创建"setState"函数用于设置该观察者"state"并且通知所有观察者。观察者创建"update"函数用于被观察者进行消息通知,该函数需要打印(console.log)数据,数据格式为:小明正在走路。其中"小明"为被观察者的"name"属性,"走路"为被观察者的"state"属性。

注意:

"Observer"为观察者,"Observerd"为被观察者。思路根据题目的第二个要求:被观察者创建"setObserver"函数用于保存观察者们。可得知setObserver函数应该接受一个observer参数,该参数代表观察者,同时因为要保存这些观察则,所以在Observerd被观察者初始化的时候应该创建一个用来保存观察者的数组observers 。根据题目的第三个要求和第四个要求可知setState函数接受一个state参数用来更新Observerd被观察者自身的state,同时setState函数还应该遍历observers数组,并调用数组中的每一项的update方法,以此来通知所有观察者。代码// 被观察者class Observerd { constructor(name) { this.name = name this.state = '走路' this.observers = [] // 存放观察者 } setObserver(observer) { this.observers.push(observer) } setState(state) { this.state = state // 遍历通知每一个观察者 this.observers.forEach(observer => { observer.update(this) }) }}// 观察者class Observer {// update被被观察者(Observerd)调用,用来接收被观察者的数据 update(observerd) { console.log(observerd.name + '正在' + observerd.state); }}
本文链接地址:https://www.jiuchutong.com/zhishi/300474.html 转载请保留说明!

上一篇:人工智能导论——遗传算法求解TSP问题实验(人工智能导论论文2000字)

下一篇:node.js安装及环境配置超详细教程【Windows系统安装包方式】(nodejs安装及环境配置win7)

  • 智伴儿童机器人怎么连接wifi(智伴儿童机器人怎么用)

    智伴儿童机器人怎么连接wifi(智伴儿童机器人怎么用)

  • 信号贴为何对手机信号无任何改善(信号贴是什么原理)

    信号贴为何对手机信号无任何改善(信号贴是什么原理)

  • miui12如何设置图标大小(miui12怎么在桌面上放图片框)

    miui12如何设置图标大小(miui12怎么在桌面上放图片框)

  • 苹果x抬头灯如何开(iphonex抬头灯)

    苹果x抬头灯如何开(iphonex抬头灯)

  • wps文档如何加密(wps2019文档加密如何设置)

    wps文档如何加密(wps2019文档加密如何设置)

  • 域名系统的主要功能(域名网站查询)

    域名系统的主要功能(域名网站查询)

  • aqmal00是华为什么型号(aqmal00是华为10s吗)

    aqmal00是华为什么型号(aqmal00是华为10s吗)

  • 记事本打开dat乱码

    记事本打开dat乱码

  • bluetooth网络连接未连接怎么解决(bluetooth connected)

    bluetooth网络连接未连接怎么解决(bluetooth connected)

  • 苹果x优化电池充电要不要打开(苹果x优化电池充电)

    苹果x优化电池充电要不要打开(苹果x优化电池充电)

  • 华为nova65g上市时间(华为nova65g什么时候出来的)

    华为nova65g上市时间(华为nova65g什么时候出来的)

  • 抖音里面如何删除动态(抖音里面如何删除自己的作品)

    抖音里面如何删除动态(抖音里面如何删除自己的作品)

  • 快手删除的视频在哪找(快手删除的视频还能找回来吗)

    快手删除的视频在哪找(快手删除的视频还能找回来吗)

  • 苹果x怎么弄呼吸灯(苹果x怎么呼唤)

    苹果x怎么弄呼吸灯(苹果x怎么呼唤)

  • 3440x1440 配什么显卡(3440x1440对比2560x1440)

    3440x1440 配什么显卡(3440x1440对比2560x1440)

  • 什么是瀑布屏幕(啥是瀑布屏)

    什么是瀑布屏幕(啥是瀑布屏)

  • 打印机的驱动程序在哪(打印机的驱动程序无法使用如何解决)

    打印机的驱动程序在哪(打印机的驱动程序无法使用如何解决)

  • 怎么关闭美团会员自动续费(怎么关闭美团会员自动续费微信)

    怎么关闭美团会员自动续费(怎么关闭美团会员自动续费微信)

  • grub怎么进入win7(grub怎么进入windows)

    grub怎么进入win7(grub怎么进入windows)

  • 苹果蓝牙耳机盒子上的按钮(苹果蓝牙耳机盒子丢了怎么办)

    苹果蓝牙耳机盒子上的按钮(苹果蓝牙耳机盒子丢了怎么办)

  • 火山小视频怎么没有同城(火山小视频怎么发图片评论)

    火山小视频怎么没有同城(火山小视频怎么发图片评论)

  • qq红包如何强制退回(qq红包如何强制注销)

    qq红包如何强制退回(qq红包如何强制注销)

  • qq怎么开远程控制(如何用qq开远程控制)

    qq怎么开远程控制(如何用qq开远程控制)

  • ltdmgr.exe是什么进程 有什么作用 ltdmgr进程查询(msgdlg.exe是什么意思)

    ltdmgr.exe是什么进程 有什么作用 ltdmgr进程查询(msgdlg.exe是什么意思)

  • 一文详解卡尔曼滤波两处噪声的来源及影响(一文详解卡尔曼人物形象)

    一文详解卡尔曼滤波两处噪声的来源及影响(一文详解卡尔曼人物形象)

  • 税金及附加二级明细
  • 增值税纳税义务早于会计准则的案例
  • 征地补偿费谁来支付
  • 补提上一年度的年终奖
  • 利润总额与毛利的区别
  • 递延收益怎么交企业所得税
  • 进项认证勾选在哪里操作
  • 苗木属于农产品中哪一类
  • 团建费用会计怎么写记账凭证
  • 公司购车入固定资产包括哪些
  • 分期付款方式销售货物什么时候确认收入
  • 事业单位经营结余贷方转入哪里
  • 付给供应商远期延期支票怎么做账?
  • 社保基金的管理模式
  • 工程发票包括哪些
  • 营业执照首次年报
  • 补记去年收入分录
  • 私对私转账是否缴纳个人所得税
  • 财产保险费计入什么科目
  • 农产品增值税核定扣除办法
  • 机器人销售属于什么行业
  • 小额贷款公司可以放贷吗
  • 原材料的借方发生额怎么算
  • 盘亏的转销金额
  • 去年管理费用多记账结账如何调账
  • 显卡硬件加速如何开启
  • 查看所有共享文档
  • 服务业缴税
  • 电脑自我诊断
  • 扣客户的罚款会计科目
  • rftray.exe - rftray是什么进程 有什么用
  • 在建工程进项税可以抵扣吗
  • 没收逾期未收回的包装物押金
  • 会计计量属性的是
  • 企业缴纳保险的比例
  • Wat Chaloem Phra Kiat Phrachomklao Rachanusorn的浮庙,泰国南邦 (© pa_YON/Getty Images)
  • 红字发票负数要怎么抵掉
  • 委托加工物资增值税计税依据
  • laravel框架的优缺点
  • php实现递归
  • 会计凭证作用的说法中不正确的是
  • 公司未成立前的花费算出资额吗
  • 企业的对公账户怎么办理
  • 员工宿舍水电费计入什么会计科目
  • phpcms 用的是什么模板引擎
  • mysql profiles
  • php_fileinfo不支持
  • 非货币性职工薪酬
  • PostgreSQL中关闭死锁进程的方法
  • 往来账款应该怎么记账
  • 营业执照注销对商标有影响吗?
  • 代开运输发票会不会造成重复征税?
  • 长期股权投资被投资方实现净利润
  • 差旅费会计科目怎么做
  • 银行备付金账户是什么帐户
  • 出差补贴如何账务处理
  • 两个公司的出纳怎么分账
  • 年底结转损益后如何结转
  • 非税收入票据如何开具
  • 残保金逾期怎么办
  • sql server 更改字段数据类型
  • linux彻底卸载软件
  • 数据库mysql索引
  • linux ubuntu安装教程
  • windows提示音神曲
  • centos zsh
  • 测试Qt Quick在各个平台上的3D渲染性能
  • webrtc介绍
  • nodejs init
  • Python字符串大写
  • 国家税务局通用手工发票
  • 委托代销清单怎么写
  • 税务暂停办理业务通知
  • 买楼送地下室划算吗
  • 北京市生育津贴发放标准
  • 河南省电子票据查询平台
  • 设区市是哪里
  • 税务局直属机构
  • 运输合同的印花税怎么申报
  • 城市维护建设税怎么算
  • 免责声明:网站部分图片文字素材来源于网络,如有侵权,请及时告知,我们会第一时间删除,谢谢! 邮箱:opceo@qq.com

    鄂ICP备2023003026号

    网站地图: 企业信息 工商信息 财税知识 网络常识 编程技术

    友情链接: 武汉网站建设