广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >前端JavaScript中的class类
  • 481
分享到

前端JavaScript中的class类

2024-04-02 19:04:59 481人浏览 八月长安
摘要

目录1、类1.1 constructor()1.2 getter和setter1.3 this1.4 静态属性1.5 静态方法2、继承2.1 super关键字2.2 _proto_和

1、类

类是用于创建对象的模板。javascript中生成对象实例的方法是通过构造函数,这跟主流面向对象语言(javaC# )写法上差异较大,如下:


function Point(x, y) {
  this.x = x;
  this.y = y;
}

Point.prototype.toString = function () {
  return '(' + this.x + ', ' + this.y + ')';
};

var p = new Point(1, 1);

es6 提供了更接近Java语言的写法,引入了 Class(类)这个概念,作为对象的模板。通过class关键字,可以定义类。

如下:constructor()是构造方法,而this代表实例对象:


class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}

类的数据类型就是函数,它本身就是指向函数的构造函数:


// ES5 函数声明
function Point() {
 //...
}

// ES6 类声明
class Point {
  //....
  constructor() {
  }
}
typeof Point // "function"
Point === Point.prototype.constructor // true

在类里面定义的方法是挂到Point.prototype,所以类只是提供了语法糖,本质还是原型链调用。


class Point {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }

  toString() {
    return '(' + this.x + ', ' + this.y + ')';
  }
}

Point.prototype = {
  //....
  toString()
}
var p = new Point(1, 1);
p.toString() // (1,1)

类的另一种定义方式类表达式


// 未命名/匿名类
let Point = class {
  constructor(x, y) {
    this.x = x;
    this.y = y;
  }
};
Point.name // Point

函数声明和类声明有个重要区别,函数声明会提升,类声明不会提升。


> let p = new Point(); // 被提升不会报错
> function Point() {}
> 
> let p = new Point(); // 报错,ReferenceError
> class Point {}
>

1.1 constructor()

constructor()方法是类的默认方法,new生成实例对象时会自动调用该方法。

一个类必须有constructor()方法,如果没有显式定义,引擎会默认添加一个空的constructor()

constructor()方法默认返回实例对象(即this)。


class Point {
}

// 自动添加
class Point {
  constructor() {}
}

1.2 getter和setter

ES5 一样,在类的内部可以使用getset关键字,对某个属性设置存值函数和取值函数,拦截该属性的存取行为。


class User {
  constructor(name) {
    this.name = name;
  }

  get name() {
    return this.name;
  }

  set name(value) {
    this.name = value;
  }
}

1.3 this

类的方法内部的this,它默认指向类的实例,在调用存在this的方法时,需要使用 obj.method()方式,否则会报错。


class User {
  constructor(name) {
    this.name = name;
  }
  printName(){
    console.log('Name is ' + this.name)
  }
}
const user = new User('jack')
user.printName() // Name is jack
const { printName } = user;
printName()     // 报错 Cannot read properties of undefined (reading 'name')

如果要单独调用又不报错,一种方法可以在构造方法里调用bind(this)


class User {
  constructor(name) {
    this.name = name;
    this.printName = this.printName.bind(this);
  }
  printName(){
    console.log('Name is ' + this.name)
  }
}
const user = new User('jack')
const { printName } = user;
printName()     // Name is jack

bind(this) 会创建一个新函数,并将传入的this作为该函数在调用时上下文指向。

另外可以使用箭头函数,因为箭头函数内部的this总是指向定义时所在的对象。


class User {
  constructor(name) {
    this.name = name;
  }
  printName = () => {
    console.log('Name is ' + this.name)
  }
}
const user = new User('jack')
const { printName } = user;
printName()     // Name is jack

1.4 静态属性

静态属性指的是类本身的属性,而不是定义在实例对象this上的属性。


class User {
}

User.prop = 1;
User.prop // 1

1.5 静态方法

可以在类里面定义静态方法,该方法不会被对象实例继承,而是直接通过类来调用。

静态方法里使用this是指向类。


class Utils {
  static printInfo() {
     this.info();
  }
  static info() {
     console.log('hello');
  }
}
Utils.printInfo() // hello

关于方法的调用范围限制,比如:私有公有,ES6暂时没有提供,一般是通过约定,比如:在方法前面加下划线_print()表示私有方法。

2、继承

Java中通过extends实现类的继承。ES6中类也可以通过extends实现继承。

继承时,子类必须在constructor方法中调用super方法,否则新建实例时会报错。


class Point3D extends Point {
  constructor(x, y, z) {
    super(x, y); // 调用父类的constructor(x, y)
    this.z = z;
  }

  toString() {
    return super.toString() + '  ' + this.z ; // 调用父类的toString()
  }
}

父类的静态方法,也会被子类继承


class Parent {
  static info() {
    console.log('hello world');
  }
}

class Child extends Parent {
}

Child.info()  // hello world

2.1 super关键字

在子类的构造函数必须执行一次super函数,它代表了父类的构造函数。


class Parent {}

class Child extends Parent {
  constructor() {
    super();
  }
}

在子类普通方法中通过super调用父类的方法时,方法内部的this指向当前的子类实例。


class Parent {
  constructor() {
    this.x = 1;
    this.y = 10
  }
  printParent() {
    console.log(this.y);
  }
  print() {
    console.log(this.x);
  }
}

class Child extends Parent {
  constructor() {
    super();
    this.x = 2;
  }
  m() {
    super.print();
  }
}

let c = new Child();
c.printParent() // 10
c.m() // 2

2.2 _proto_和prototype

初学JavaScript时, _proto_prototype 很容易混淆。首先我们知道每个js对象都会对应一个原型对象,并从原型对象继承属性和方法。

  • prototype 一些内置对象和函数的属性,它是一个指针,指向一个对象,这个对象的用途就是包含所有实例共享的属性和方法(我们把这个对象叫做原型对象)。
  • _proto_ 每个对象都有这个属性,一般指向对应的构造函数的prototype属性。

下图是一些拥有prototype内置对象:

根据上面描述,看下面代码


var obj = {} // 等同于 var obj = new Object()

// obj.__proto__指向Object构造函数的prototype
obj.__proto__ === Object.prototype // true 

// obj.toString 调用方法从Object.prototype继承
obj.toString === obj.__proto__.toString // true

// 数组
var arr = []
arr.__proto__ === Array.prototype // true

对于function对象,声明的每个function同时拥有prototype__proto__属性,创建的对象属性__proto__指向函数prototype,函数的__proto__又指向内置函数对象(Function)的prototype


function Foo(){}
var f = new Foo();
f.__proto__ === Foo.prototype // true
Foo.__proto__ === Function.prototype // true

2.3 继承中的__proto__

类作为构造函数的语法糖,也会同时有prototype属性和__proto__属性,因此同时存在两条继承链。

  • 子类的__proto__属性,表示构造函数的继承,总是指向父类。
  • 子类prototype属性的__proto__属性,表示方法的继承,总是指向父类的prototype属性。

class Parent {
}

class Child extends Parent {
}

Child.__proto__ === Parent // true
Child.prototype.__proto__ === Parent.prototype // true

2.4 继承实例中的__proto__

子类实例的__proto__属性,指向子类构造方法的prototype

子类实例的__proto__属性的__proto__属性,指向父类实例的__proto__属性。也就是说,子类的原型的原型,是父类的原型。


class Parent {
}

class Child extends Parent {
}

var p = new Parent();
var c = new Child();

c.__proto__ === p.__proto__ // false
c.__proto__ === Child.prototype // true
c.__proto__.__proto__ === p.__proto__ // true

3、小结

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

--结束END--

本文标题: 前端JavaScript中的class类

本文链接: https://www.lsjlt.com/news/155110.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

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

下载Word文档
猜你喜欢
  • 前端JavaScript中的class类
    目录1、类1.1 constructor()1.2 getter和setter1.3 this1.4 静态属性1.5 静态方法2、继承2.1 super关键字2.2 _proto_和...
    99+
    2022-11-12
  • JavaScript中的class类详解
    目录类的基本语法类的继承类的静态方法类的优势和适用场景结论类的基本语法 在 JavaScript 中,使用 class 关键字可以定义一个新的类。类与传统的 Ja...
    99+
    2023-05-19
    JavaScript Class类 JS Class
  • JavaScript前端中的伪类元素before和after如何使用
    今天小编给大家分享一下JavaScript前端中的伪类元素before和after如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来...
    99+
    2023-07-05
  • JavaScript前端中的伪类元素before和after使用详解
    目录1.基本用法2.样式修改3.清除浮动4.content属性1、string2、attr()3、url()/uri()4、counter()before/after伪类相当于在元素...
    99+
    2023-02-21
    JS before和after JS伪类元素
  • ES6 javascript中class类的get与set怎么用
    这篇文章将为大家详细讲解有关ES6 javascript中class类的get与set怎么用,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。具体如下:与 ES5 一样, 在...
    99+
    2022-10-19
  • ES6 javascript中Class类继承的示例分析
    小编给大家分享一下ES6 javascript中Class类继承的示例分析,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!具体如下:1. 基本用法Class 之间可以通过extends关键字...
    99+
    2022-10-19
  • JavaScript ES6中class定义类实例方法
    目录前言正文1.声明类的两种方式:2.class 类的构造函数3.class中方法定义3.1 class 中定义普通的实例方法3.2 class 类中定义访问器方法3.3 类的静态方...
    99+
    2022-11-13
  • JavaScript ES6中class定义类的方法有哪些
    这篇文章主要介绍“JavaScript ES6中class定义类的方法有哪些”,在日常操作中,相信很多人在JavaScript ES6中class定义类的方法有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作...
    99+
    2023-07-02
  • 前端JavaScript中的反射和代理
    目录1、什么是反射2、JavaScript中Reflect2.1 Reflect.get(target, name, receiver)2.2 Reflect.set(target,...
    99+
    2022-11-12
  • javascript属于前端还是后端的
    小编给大家分享一下javascript属于前端还是后端的,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!javascript是前端。javascript是前端开发语...
    99+
    2023-06-14
  • javascript中class指的是什么
    这篇文章主要介绍“javascript中class指的是什么”,在日常操作中,相信很多人在javascript中class指的是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2022-10-19
  • ES6中的class类怎么使用
    本篇内容主要讲解“ES6中的class类怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ES6中的class类怎么使用”吧! 认识class定义类 我...
    99+
    2022-10-19
  • ES6中class类的示例分析
    这篇文章主要介绍了ES6中class类的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。class 类通过class可以定义类,新的c...
    99+
    2022-10-19
  • 深入解析php中的class(类)
    PHP是一种流行的编程语言,其中面向对象编程(OOP)是其最强大的特性之一。PHP Class是OOP中的核心概念,它提供了一种封装数据和行为的机制。这些Class为我们提供了可重用的代码,减少了代码冗余并提高了代码的可维护性。本文将介绍P...
    99+
    2023-05-14
    class php
  • 深入浅出JavaScript前端中的设计模式
    目录关于设计模式七种常见的设计模式单例模式工厂模式适配器模式装饰器模式策略模式观察者模式发布-订阅模式关于设计模式 软件设计模式,又称设计模式,是一套被反复使用、多数人知晓的、经过分...
    99+
    2023-05-20
    JavaScript设计模式 JS设计模式
  • 常用的前端JavaScript方法封装
    目录1、输入一个值,返回其数据类型**2、数组去重3、字符串去重4、深拷贝 浅拷贝5、reverse底层原理和扩展6、圣杯模式的继承7、找出字符串中第一次只出现一次的字母8、找元素的...
    99+
    2022-11-12
  • Java中通过Class类获取Class对象的方法详解
    前言本文主要给大家介绍的是关于Java通过Class类获取Class对象的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍:阅读API的Class类得知,Class 没有公共构造方法。Class 对象是在加载类时由 J...
    99+
    2023-05-31
    java class类 class对象
  • 对比前后端接口: 研究常见的前后端交互接口类型
    前后端接口对比: 探究前后端交互中常见的接口类型,需要具体代码示例一、引言随着互联网的快速发展,前后端分离的开发模式逐渐成为主流。在此模式中,前端开发人员和后端开发人员通过接口实现数据的交互和通信。因此,了解不同的接口类型以及其特点对于实现...
    99+
    2023-12-23
    接口类型 前端接口 后端接口
  • Java中的实体类(entity class)和model
    一、什么是实体类(entity class) 编写代码时,经常会遇到一些具有“现实”意义的“个体”,eg:一个用户、一首歌曲、一条评论等。它们在逻辑上是完整的整体,具有相似的结构,但是却因为“属性”的不同而不同。 下面看一个典型的E...
    99+
    2023-09-23
    java 开发语言 Powered by 金山文档
  • Java中class类的作用是什么
    这篇文章给大家介绍Java中class类的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Class 类是在Java语言中定义一个特定类的实现。一个类的定义包含成员变量,成员方法,还有这个类实现的接口,以及这个...
    99+
    2023-05-30
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作