JS中Class类的详解

JS中Class类的详解概述    在ES6中,class(类)作为对象的模板被引入,可以通过class关键字定义类。它可以被看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。    类实际上是个“特殊的函数”,就像你能够定义的函数表达式和函数声明一样,类语法有两个组成部分:类表达式和类声明。严格模式    类和模块的内部,默认就是严格模式,所以不需要使用usestrict指定运行模式…

大家好,又见面了,我是你们的朋友全栈君。

概述

    在ES6中,class (类)作为对象的模板被引入,可以通过 class 关键字定义类。它可以被看作一个语法糖,让对象原型的写法更加清晰、更像面向对象编程的语法。
    类实际上是个“特殊的函数”,就像你能够定义的函数表达式和函数声明一样,类语法有两个组成部分:类表达式和类声明。

严格模式

    类和模块的内部,默认就是严格模式,所以不需要使用 use strict 指定运行模式

类的声明

定义一个类的一种方法是使用一个类声明,即用带有class关键字的类名(这里是“Rectangle”)
函数名和实例化构造名相同且大写(非强制)

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

函数声明和类声明之间的一个重要区别是函数声明会提升,类声明不会。需要先进行声明,再去访问,否则会报错

var person= new Person()
class Person { 
   
	constructor(x, y) { 
   
    this.x = x
    this.y = y
  }
}
// Personis not defined

类声明不可以重复

class Person { 
   }
class Person { 
   }
// TypeError Identifier 'Person' has already been declared

类必须使用 new 调用,否则会报错。这是它跟普通构造函数的一个主要区别,就是后者不用 new 也可以执行

class Person { 
   
	constructor(x, y) { 
   
    this.x = x
    this.y = y
  }
}
Person()
// TypeError Class constructor Person cannot be invoked without 'new'

类表达式(类定义)

类表达式可以是被命名的或匿名的

/* 匿名类 */ 
let Person = class { 
   
  constructor(x, y) { 
   
    this.x = x
    this.y = y
  }
}

/* 命名的类 */ 
let Person = class Person { 
   
  constructor(x, y) { 
   
    this.x = x
    this.y = y
  }
}

类的方法

constructor 方法

    constructor 方法是类的默认方法,通过 new 命令生成对象实例时,自动调用该方法(默认返回实例对象 this)。一个类必须有 constructor 方法,如果没有显式定义,一个空的 constructor 方法会被默认添加。一个类只能拥有一个名为 “constructor” 的特殊方法,如果类包含多个 constructor 的方法,则将抛出 一个 SyntaxError 。

class Person { 
   
   constructor(x, y) { 
   
    this.x = x    // 默认返回实例对象 this
    this.y = y
  }
  toString() { 
   
    console.log(this.x + ', ' + this.y)
  }
}

注意:

  1. 在类中声明方法的时候,方法前不加 function 关键字
  2. 方法之间不要用逗号分隔,否则会报错
  3. 类的内部所有定义的方法,都是不可枚举的(non-enumerable)
  4. 一个类中只能拥有一个 constructor 方法

静态方法

    静态方法可以通过类名调用,不能通过实例对象调用,否则会报错

class Person { 
   
    static sum(a, b) { 
   
        console.log(a + b)
    }
}
var p = new Person()
Person.sum(1, 2)  // 3
p.sum(1,2)     // TypeError p.sum is not a function

原型方法

    类的所有方法都定义在类的 prototype 属性上面,在类的实例上面调用方法,其实就是调用原型上的方法
    原型方法可以通过实例对象调用,但不能通过类名调用,会报错

class Person { 
   
	constructor() { 
   
		// 默认返回实例对象 this
	}
    sum() { 
   
    	
    }
    toString() { 
   
    	console.log('123456')
  	}
}
// 给 Person 的原型添加方法
Person.prototype.toVal = function() { 
   
	console.log('I am is toVal')
}

// 等同于
Person.prototype = { 
   
  constructor() { 
   },
  sum() { 
   },
  toString() { 
   }
}

var p = new Person()
p.toString()       // 123456
p.toVal()          // I am is toVal
Person.toString()  // TypeError Person.toStringis not a function
Person.toVal()  // TypeError Person.toVal is not a function

实例方法

    实例方法也可以通过实例对象调用,但同样不能通过类名调用,会报错

class Person { 
   
    constructor() { 
   
        this.sum = function(a, b) { 
   
            console.log(a + b)
        }
    }
}
var p = new Person()
p.sum(1,2)       // 3
Person.sum(1,2)  // TypeError Person.sum is not a function
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136841.html原文链接:https://javaforall.net

(0)
上一篇 2022年6月2日 下午11:16
下一篇 2022年6月2日 下午11:16


相关推荐

  • qca wlan wifi modules 解析一

    qca wlan wifi modules 解析一分析lsdk-ap121lsdk-ap134源码:https://github.com/hades13/lsdk_ar9531包含wifidrivers另一wifidrivers版本:https://download.csdn.net/download/nolycjyf/3722308目录结果:appsbuilddriversincludemodulesbo…

    2022年7月27日
    14
  • 如何把.ipynb文件转化为.py文件

    如何把.ipynb文件转化为.py文件第一种方法是 在 ipynb 文件所在的目录下打开一个终端 然后输入 jupyternbcon ipynb 就能把当前文件夹下面的所有的 ipynb 文件转化为 py 文件 第二种方法是 step1 启动 Jupyternoteb 在浏览器中 找到 ipynb 文件所在目录 step3 打开该 ipynb 文件 点击 Files Downloadas Python 即可下载转换好的 Python 文件 如果需要的话 也可以转换为列表中的其

    2026年3月26日
    2
  • Mac联网恢复系统重新安装Lion

    Mac联网恢复系统重新安装LionMac 的 Lion 系统 虽然不像 Windows 那样需要经常重装 但也难免会有要重置的时候 比如更换硬盘 本文介绍如何利用 Mac 的联网恢复系统进行 Lion 系统的在线恢复 Mac 的在线恢复系统只在近几年的机型上才有 在进行系统恢复前 请您先备份好硬盘中的数据 恢复步骤 1 按开机按钮后 按住 Option 键不放 当出现启动磁盘选择画面时 按下 Command R 键 进入 Recov

    2026年3月18日
    2
  • db2中You can’t specify target table for update in FROM clause错误

    db2中You can’t specify target table for update in FROM clause错误db2中You can’t specify target table for update in FROM clause错误

    2022年4月23日
    73
  • 一分钟详解「手眼标定」基本原理[通俗易懂]

    一分钟详解「手眼标定」基本原理[通俗易懂]原文首发于微信公众号【视觉IMAX】。一前言机器人的视觉系统分为固定场景视觉系统和运动的「手-眼」视觉系统。摄像机与机器人的手部末端,构成手眼视觉系统。根据摄像机与机器人相互位置的不同,手眼视觉系统分为Eye-in-Hand系统和Eye-to-Hand系统。Eye-in-Hand系统的摄像机安装在机器人手部末端(end-effector),在机器人工作过程中随机器人一起运动。Eye-to-…

    2022年5月5日
    174
  • int型转换为long型遇到的一个小问题

    int型转换为long型遇到的一个小问题LeetCode上有一道题:给出一个数n,求(0,n)之间素数的个数。然后我采用埃拉托斯特尼筛法在每次找到一个素数时,将能被素数整除的数排除掉。但是,在进行int类型转换的时候会报:java.lang.ArrayIndexOutOfBoundsException代码如下:publicintcountPrimes(intn){boolea…

    2022年6月4日
    55

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号