我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JS怎么使用function实现一个class

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JS怎么使用function实现一个class

本文小编为大家详细介绍“JS怎么使用function实现一个class”,内容详细,步骤清晰,细节处理妥当,希望这篇“JS怎么使用function实现一个class”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

正文

使用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不是指向MyClass        throw 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)){            //error            throw TypeError('error')        }        console.log('myName:'+this.name)    },    enumerable:false})let m1 = new MyClass1('aaa')m1.fn()// new m1.fn() //errorfor(let i in m1){    console.log(i) //name}

读到这里,这篇“JS怎么使用function实现一个class”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网行业资讯频道。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JS怎么使用function实现一个class

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

JS怎么使用function实现一个class

本文小编为大家详细介绍“JS怎么使用function实现一个class”,内容详细,步骤清晰,细节处理妥当,希望这篇“JS怎么使用function实现一个class”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。正
2023-07-04

怎么使用ES6的class实现一个双向绑定

这篇文章主要介绍“怎么使用ES6的class实现一个双向绑定”,在日常操作中,相信很多人在怎么使用ES6的class实现一个双向绑定问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么使用ES6的class实现
2023-07-04

Java 中怎么实现一个Class解析器

Java 中怎么实现一个Class解析器,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Class文件作为类或者接口信息的载体,每个Class文件都完整的定义了一个类。为了使Ja
2023-06-17

JS的Function与构造函数怎么使用

这篇文章主要讲解了“JS的Function与构造函数怎么使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“JS的Function与构造函数怎么使用”吧! 1.概述Function是一个构造函
2023-06-21

怎么使用ES6的class写一个双向绑定

今天小编给大家分享一下怎么使用ES6的class写一个双向绑定的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。最终效果如下:构
2023-06-17

PHP中怎么使用class来声明一个接口

在PHP中,可以使用关键字interface来声明一个接口。接口是一种抽象的类,其中定义了一组方法但不包含方法的实现。下面是一个示例,展示了如何在PHP中声明一个接口:
PHP中怎么使用class来声明一个接口
2024-03-04

JS怎么实现一个微信录音功能

今天小编给大家分享一下JS怎么实现一个微信录音功能的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。拆解需求根据原型图可以很容易
2023-07-05

使用CSS怎么实现一个圆环

使用CSS怎么实现一个圆环?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。1. 两个标签的嵌套:
2023-06-08

怎么使用CSS3实现一个3D相册

这篇文章给大家分享的是有关怎么使用CSS3实现一个3D相册的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。布局直接看html布局: