JavaScript ES6中class定义类实例方法

 更新时间:2022年07月08日 11:10:16   作者:不苒  
ES6提供了更接近面向对象(注意:javascript本质上是基于对象的语言)语言的写法,引入了Class(类)这个概念,作为对象的模板,下面这篇文章主要给大家介绍了关于JavaScript ES6中class定义类的相关资料,需要的朋友可以参考下

前言

我们会发现,按照之前学习过的构造函数形式创建 类 ,不仅仅和编写普通的函数过于相似,而且代码并不容易理解。

在 ES6(ECMAScript2015)新的标准中使用了class关键字来直接定义类;
但是类本质上依然是之前所学习过的构造函数、原型链的语法糖而已。所以学好之前的构造函数、原型链更有利于我们理解类的概念和继承关系。

正文

1.声明类的两种方式:

class 关键字 类的声明

class Person{}

类表达式(不常用)

var People = class { }

那么 Person类的原型是什么?如下展示了原型和typeof中Person的类型

console.log(Person.prototype) // Person {}
console.log(Person.prototype.__proto__) // {}
console.log(Person.constructor) // [Function: Function]
console.log(typeof Person) // function

2.class 类的构造函数

如果我们希望在创建对象的时候给类传递一些参数,这个时候应该怎么做呢?

  • 每个类都可以有一个自己的构造函数(方法),这个方法的名称是固定的 constructor
  • 当我们通过new操作符,操作一个类的时候会调用这个类的构造函数constructor
  • 每个类只能有一个构造函数,如果包含多个构造函数,那么会抛出异常。

示例代码如下:

// 类的声明
class Person {
    // 类的构造方法
    constructor(name, age) {
        this.name = name
        this.age = age
    }
    foo () {
        console.log(this.name)
    }
}
var p1 = new Person('h', 19)

console.log(p1)// Person { name: 'h', age: 19 }
p1.foo() // h

当我们通过new关键字操作类的时候,会调用这个 constructor函数,并执行如下操作(假设new关键字新创建的对象为p1):

  • 在内存中创建一个对象
  • 将类的原型prototype赋值给创建出来的对象 p1.__proto__ = Person.prototype
  • 将对象赋值给函数的this:new绑定 this = p1
  • 执行函数体中的代码
  • 自动返回创建出来的对象
    **

3.class中方法定义

3.1 class 中定义普通的实例方法

class Person {
    // 类的构造方法
    constructor(name, age) {
        this.name = name
        this.age = age
        this._address = '北京市'
    }
    eating () {
        console.log(this.name + ' 正在eating~')
    }
    running () {
        console.log(this.name + ' 正在running~')
    }
}

var p1 = new Person('jam', 19)
console.log(p1)
p1.eating()
p1.running()

3.2 class 类中定义访问器方法

class Person {
    // 类的构造方法
    constructor(name, age) {
        this.name = name
        this.age = age
        this._address = '北京市'
    }
    // 类的访问器方法
    get address () {
        // 在这里可以设置拦截访问操作
        console.log('获取呢')
        return this._address
    }
    set address (newValue) {
        // 在这里可以设置拦截设置操作
        console.log('修改呢')
        return this._address = newValue
    }
}

var p1 = new Person('jam', 19)
console.log(p1.address)
p1.address = '天津市'
console.log(p1.address)

3.3 类的静态方法(类方法)

类的静态方法就是在方法前加一个static关键字,该方法就成为了类的静态方法。
类的静态方法,不会被类的实例继承,而是直接通过类来调用。

小案例:使用类的静态方法完成随机生成Person实例

class Person {
    // 类的构造方法
    constructor(name, age) {
        this.name = name
        this.age = age
        this._address = '北京市'
    }
    
    // 类的静态方法(也称为类方法)  创建对象随机生成一个名字小案例
    static randomPerson () {
        // 创建一个存储名字的数组
        let names = ['jam', 'jak', 'jag', 'jao', 'jno']
        // Math.random()生成一个0-1之间的数字,小数肯定是不对的
        let nameIndex = Math.floor(Math.random() * names.length)
        let name = names[nameIndex]
        // 生成随机年龄
        let age = Math.floor(Math.random() * 100)
        // return随机生成的人物 姓名+ 年龄
        return new Person(name, age)
    }
}

这里直接调用类的静态方法就可以 不需要使用new操作符创建创建实例对象

随机生成一个Person实例(附效果图)

// 随机生成一个  
var p2 = Person.randomPerson()
console.log(p2)

请添加图片描述

随机生成多个Person实例(附带效果图)

// 随机生成多个
for (let index = 0; index < 20; index++) {
    console.log(Person.randomPerson())
}

文末

到此这篇关于JavaScript ES6中class定义类的文章就介绍到这了,更多相关ES6中class定义类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 用javascript实现分割提取页面所需内容

    用javascript实现分割提取页面所需内容

    用javascript实现分割提取页面所需内容...
    2007-05-05
  • JS算法教程之字符串去重与字符串反转

    JS算法教程之字符串去重与字符串反转

    这篇文章主要给大家介绍了关于JS算法教程之字符串去重与字符串反转的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-12-12
  • JavaScript 上传文件限制参数案例详解

    JavaScript 上传文件限制参数案例详解

    这篇文章主要介绍了JavaScript 上传文件限制参数案例详解,本篇文章通过简要的案例,讲解了该项技术的了解与使用,以下就是详细内容,需要的朋友可以参考下
    2021-09-09
  • e.target与e.currentTarget对象的使用区别详解

    e.target与e.currentTarget对象的使用区别详解

    这篇文章主要为大家介绍了e.target与e.currentTarget的使用区别示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-07-07
  • 使用dynatrace-ajax跟踪JavaScript的性能

    使用dynatrace-ajax跟踪JavaScript的性能

    DynaTrace 致力于分析后台应用性能的表现已经好几年了,最近,他们通过发布dynaTrace Ajax Edition进入了前端性能分析领域. 它是一个运行在IE下的BHO免费工具. 虽然我喜欢Firefox和它下面的所有插件,但我知道基于IE的测试和调试也是很重要的。
    2010-04-04
  • 复杂的javascript窗口分帧解析

    复杂的javascript窗口分帧解析

    这篇文章主要为大家详细解析了复杂的javascript窗口分帧,什么是窗口分帧,JavaScript中帧窗口之间的关系,感兴趣的小伙伴们可以参考一下
    2016-02-02
  • Js中var,let,const的区别你知道吗

    Js中var,let,const的区别你知道吗

    众所周知在Javascript中,var、let、const都可用于变量声明,但是之前没有梳理过它们之间的区别,下面这篇文章主要给大家介绍了关于Js中var,let,const区别的相关资料,需要的朋友可以参考下
    2023-02-02
  • 微信小程序实现下拉选项框

    微信小程序实现下拉选项框

    这篇文章主要为大家详细介绍了微信小程序实现下拉选项框,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • JavaScript实现ASC转汉字及汉字转ASC的方法

    JavaScript实现ASC转汉字及汉字转ASC的方法

    这篇文章主要介绍了JavaScript实现ASC转汉字及汉字转ASC的方法,涉及JavaScript编码转换的相关技巧,需要的朋友可以参考下
    2016-01-01
  • Mac下使用charles遇到的问题以及解决办法

    Mac下使用charles遇到的问题以及解决办法

    本文主要介绍了Mac下使用charles遇到的问题以及解决办法。具有一定的参考价值,下面跟着小编一起来看下吧
    2017-01-01

最新评论