[前端攻坚]:如何优雅的用function实现一个class

news2025/1/24 14:31:52

使用function来写出一个class的类对于我们来说当然是简单的,但必须注意的是,要做好function实现一个class,那么就要必须实现达到高精准度的模仿,把该实现的细节都实现好,才能更好的对class进行深入的理解

废话少说,开始写出我们的class

class MyClass{constructor(name){this.name = name}fun(){console.log('myName:'+this.name)}
} 

这是一个平平无奇的class,接着我们使用function来对其进行一下实现。

function MyClass1(name){this.name = name
}
MyClass1.prototype.fun = function(){console.log('myName:'+this.name)
}
let m1 = new MyClass1('aaa')
m1.fun() //myName:aaa 

好的本期水文到此结束谢谢大家!!!???

|

|

|

|

|

|

你没走!好样的!你很有进大厂的天赋哦!

让我们继续完善一下function的实现,我们先一步一步来

Tip1:class只能通过new调用

class MyClass{constructor(name){this.name = name}fun(){console.log('myName:'+this.name)}
}
// MyClass('aaa') //TypeError: Class constructor MyClass cannot be invoked without 'new' 

对于类的调用,只能通过new来进行实例化,而不能通过直接调用,下面我们在function来实现这个操作

如何判断是通过new调用而不是通过直接调用,这个时候this的熟练度就显得比较重要了,不熟悉也不要急,让我们一起来打印看看

function MyClass1(name){console.log(this)this.name = name
}

let m1 = new MyClass1('aaa') //MyClass1 {}
MyClass1('aaa') //window 
  • 对于new调用,函数内部的this指向构造函数 (new绑定)
  • 直接调用 那么很明显this指向的是全局(默认绑定)

根据这个特点,在构造函数里面判断this的指向,从而抛出报错,即可实现class的效果

function MyClass1(name){console.log(this)if(!(this instanceof MyClass)){ //如果this不是指向MyClassthrow new TypeError('TypeError: Class constructor MyClass cannot be invoked without 'new'')}this.name = name
} 

Tip2:class中的函数不能被枚举

let m = new MyClass('aaa')
for(let i in m){console.log(i) //name
}

let m1 = new MyClass1('aaa')
for(let i in m1){console.log(i) //name fn
} 

从上可以看出类中的函数不能被枚举出来,枚举我们就想到了enumerable,也就是Object.defineProperty来对原型上的fn进行设置

'use strict'
function MyClass1(name){this.name = name
}
Object.defineProperty(MyClass1.prototype,'fn',{value:function(){console.log('myName:'+this.name)},enumerable:false
}) 

好的,我们离完美又更近了一步。

Tip3:class中的函数不能被new调用

同样是new调用的方式,不能对类中的函数进行new调用

let m = new MyClass('aaa')
new m.fun() //TypeError: m.fun is not a constructor 

在这里会抛出一个错误,所以在用function实现类的时候也要避免这个问题,function中的函数都是可以通过new来进行调用的,我们来进行修改,有了上面对new的判断经验,很容易来解决这个问题

Object.defineProperty(MyClass1.prototype,'fn',{value:function(){//不可通过new调用 console.log(this) //正常调用下的this是指向实例 MyClass1 { name: 'aaa' }if(!(this instanceof MyClass1){//那么相反 不是正常调用的就是错误的调用//error}console.log('myName:'+this.name)},enumerable:false
}) 

同样使用this的判断来看下是不是通过new的调用,正常调用下的this是指向实例 MyClass1,那么相反 不是正常调用的就是错误的调用

最后是一个小小的细节

Tip4:在ES6中使用类语法,代码都是在严格模式下运行

所以对于function的代码,需要在前面加上’user strict‘

'use strict'
function MyClass1(name){this.name = name
}
Object.defineProperty(MyClass1.prototype,'fn',{value:function(){console.log(this)if(!(this instanceof MyClass1)){//errorthrow TypeError('error')}console.log('myName:'+this.name)},enumerable:false
})
let m1 = new MyClass1('aaa')
m1.fn()
// new m1.fn() //error
for(let i in m1){console.log(i) //name
} 

恭喜你认真的看完了,希望你也能学习到一点~

到这里我们就完结撒花啦~~

最后

整理了75个JS高频面试题,并给出了答案和解析,基本上可以保证你能应付面试官关于JS的提问。



有需要的小伙伴,可以点击下方卡片领取,无偿分享

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/105091.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

js逆向-无限debugger的原理与绕过

js逆向-无限debugger的原理与绕过 debugger是JavaScript中定义的一个专门用于断点调试的关键字,只要遇到他,JavaScritp的执行便会在此处中断,进入调试模式。 有了debugger这个关键字,我们就可以非常方便地对JavaScript代码进行调试,比如使用JavaScript Hook时,我们可以…

想用python拿大厂offer?那这个一定是你需要的

想用python拿大厂offer?那这个一定是你需要的 python,是一种解释型(高级)的,面向对象的,带有动态语义的高级程序设计的开源语言。1989年,Guido von Rossum(荷兰人)人称龟…

新华三推出人工智能模型训练平台,让智慧算力触手可及

随着AI技术不断完善升级,产业界的主要需求已经不再是基础算法的打磨,而是如何让AI技术与行业场景、企业需求相契合。不久之前,科技部等六部门联合印发了《关于加快场景创新以人工智能高水平应用促进经济高质量发展的指导意见》,明…

新浪l2接口如何获取某个记录类型对应的记录情况?

新浪l2接口获取某个记录类型对应的记录情况: 用法: get_result_records (recordtype, index, ContextInfo) 释义: 获取某个记录类型对应的某个时刻的记录情况。 *注:模型回测时有效,获取的为回测面板中的记录结果 …

Jmeter结果处理小心得

[内部资源] 想拿年薪30W的软件测试人员,这份资料必须领取~ Python自动化测试全栈性能测试全栈,挑战年薪40W 正文 工作中用jmeter请求一个接口对谈得上会jmeter的人似乎都是可以做出来的,但是实际难点是参数化,结果的断言&#…

谁会嫌钱多啊,最适合Python兼职攻略以及接私活经验!一定要看到最后!

想给大家谈谈一个非常热门的话题,就是如何在学习python的同时去赚钱。在这篇文章中,你会学习到如何通过学习python来赚取副业收入。 相信大家都对钱感兴趣吧,如果你和马云爸爸对钱不敢兴趣的话,那这篇文章就不适合你了。 如果你想…

ArcGIS的城市空间发展模拟预测案例

ArcGIS除了空间分析评价、综合制图等, 它其实还有一个很强大的功能! 这个功能,简直就是科研利器, 就叫它——模拟预测分析吧! 它涉及地质、环保、国土、规划、水利、气象等多方面的分析应用,科学进行城市空间发展变化的模拟预测! 城市空间单元划分与采样 划定分析单元…

汇编数据串操作和修改标志位指令处理机控制指令

目录 不使用数据串操作 数据串指令 数据串操作指令注意: MOVS数据串传送指令 (重点掌握) REP重复指令(补充) LODS取数据串(只有源) STOS存入串(只有目标) CMPS串比较 可以加重…

设计模式之责任链模式

Chain of responsibility 责任链模式的概念、责任链模式的结构、责任链模式的优缺点、责任链模式的使用场景、责任链模式的实现示例、责任链模式的源码分析 1、责任链模式的概念 责任链模式,即把请求从链中的一个对象传到下一个对象,知道请求被响应为止…

多数据源事务处理-涉及分布式事务

一. 数据源跨库但是不跨 MySql 实例 这个形式就是数据源在同一个 MySQL 下,但是 jdbc-url 上的数据库配置不同,涉及多个数据库时,如果方法中发生异常,只有开启事务的数据源会发生回滚,其他数据源不会回滚。看到这里可…

禅道 删除回收站

回收站的内容只能进入数据库删 如何访问数据库 1、网页登录数据库 禅道数据库管理用的是adminer,但是为了安全,访问adminer的时候需要身份验证,需要运行/opt/zbox/auth/adduser.sh来添加用户(先 cd /opt/zbox/auth/ 然后执行 ./adduser.sh…

线程和进程 / 进程和线程的区别和联系

💖 欢迎来阅读子豪的博客(JavaEE篇 🤴) 👉 有什么宝贵的意见或建议可以在留言区留言 💻 欢迎 素质三连 点赞关注 收藏 🧑‍🚀码云仓库:补集王子的代码仓库 不要偷走我小…

飞宇医药冲刺创业板:年营收4.56亿 拟募资4.38亿

雷递网 雷建平 12月20日江苏飞宇医药科技股份有限公司(简称:“飞宇医药”)日前递交招股书,准备在深交所创业板上市。飞宇医药计划募资4.38亿元,其中,1.79亿元用于年产6000吨侧链及6,000吨酰氯扩产项目&…

QT Qmake笔记

文章目录概述QT修改样式qmake概述pro文件常见配置项库引用和库路径指定QT创建动态库和使用(重要)小例子写动态库用动态库参考资料附录概述 本文记录一些学习QT过程中的笔记。 QT修改样式 styleSheet: background-image:url("/home/o…

大学生转行,毕业一年半,她是如何从工地走向互联网的?

如果专业与工作不匹配?如果觉得现有工作不适合自己?如果想转行?可以看一下她的成长故事。 领英18年数据显示,职场人第一份工作在职时间显著缩短,70后平均超过4年换一次工作,80后是3年半,90后是…

Bitmap64为什么比bitmap32慢

https://www.bilibili.com/video/BV1vU4y1q7KR/?spm_id_from333.788&vd_sourcefa36a95b3c3fa4f32dd400f8cabddeaf 原因跟 RoaringBitmap64 的实现有关,RoaringBitmap64 是由一系列 RoaringBitmap32 表示。实现方式有很多种,一种比较通用的做法用 ma…

【MyBatis】MyBatis Plus的使用

1.Mybatis-Plus 1.1 简介 MyBatis-Plus 是一个 Mybatis 增强版工具,在 MyBatis 上扩充了其他功能没有改变其基本功能,为了简化开发提交效率而存在。 官网文档地址:   https://mp.baomidou.com/guide/ MyBatis-Plus 特性:  …

非科班出身转行IT难吗?好找工作吗?

大家都知道,IT行业是出了名的高薪行业,很多传统行业/专业的小伙伴由于薪资低、就业机会少而有了想转行IT的想法。 他们通常有以下几个问题: 非计算机专业0基础能学会技术吗?非计算机专业如何转行到IT行业?非计算机专…

记录--可视化大屏-用threejs撸一个3d中国地图

这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 不想看繁琐步骤的,可以直接去github下载项目,如果可以顺便来个star哈哈 本项目使用vue-cli创建,但不影响使用,主要绘制都已封装成类 1、使用geoJson绘制…

Java并发系列源码分析(四)--StampedLock

简介 ReentrantReadWriteLock是一个悲观的可重入的读写锁,而StampedLock既支持悲观锁也支持乐观锁但不支持锁的重入, 在ReentrantReadWriteLock下如果多个线程同时获取读锁的时候,获取写锁的线程就会被挂起进行等待,在StampedLock乐观锁下如果有线程加了写锁,其它读线程可以获…