JS在创建之初不支持类,因为很多开发者为处理类创建了好多代码库,最终导致ES6引入了类。

ES5及更早的版本都不支持类,与类最接近的是:创建一个构造器,然后将方法指派到该构造器的原型上。就是原型继承。原型继承的模式在许多JS库中都存在,这也是ES6类的出发点。

类的声明:

以class关键字开始,其后是类的名称;剩余部分的语法看起来像是对象字面量中的方法简写,在方法之间不需要使用逗号。栗子如下:

class personClass{
constructor(name){
this.name = name;
}
sayName(){
console.log(this.name);
}
}
let person = new personClass("Miya");
person.sayName(); //Miya
  console.log(typeof personClass); //function
  console.log(person instanceof personClass); //true
  console.log(typeof personClass.prototype.sayName);  //function
 
  //使用类表达式
  let personClass = class {  ...  }

class中使用特殊的constructor方法名称直接定义一个构造器,之外的方法名称则没有特别的含义,可以根据需求随意添加。

personClass声明实际上创建了一个拥有constructor方法及其行为的函数,typeof personClass会得到“function”结果的原因。sayName()方法最终是personClass.prototype上的一个方法。

为什么要使用类的语法?

类和自定义类型之间的区别:

1,类声明不会被提升,类声明的行为与let相似,因此在程序执行到声明处之前,类都会位于暂时性死区。

2,类声明中的所有代码会自动运行并锁定在严格模式下。

3,类的所有方法不可枚举。

4,类的所有方法内部没有constructor,因此使用new来调用类里面的方法会报错。

5,调用类构造器时不使用new,会报错。

6,试图在类的方法内部重写类名,会报错。

使用类表达式的功能等价于类声明。区别就是代码风格问题,就像:函数声明和函数表达式之间的区别。看下面的定义方法:

let personClass = class personClass2{
constructor(name){
this.name = name;
}
sayName(){
console.log(this.name);
}
}
  console.log(typeof personClass); //function
console.log(typeof personClass2); //undefined

类表达式命名为personClass,personClass2标识符只在类定义内部存在。在类的外部,typeof personClass2的结果为“undefined”,因为在外部不存在personClass2的绑定。其实上面的personClass的定义等价于:

let personClass = (function(){
"use strict";
const personClass2 = function(name){
if(typeof new.target === "undefined"){
throw new Error("Constructor must be called with new");
}
this.name = name;
}
Object.defineProperty(personClass2.prototype,"sayName",{
value:function(){
if(typeof new.target !== "undefined"){
throw new Error("Method cannot ba called with new.");
}
console.log(this.name);
},
enumerable:false,
writable:true,
configurable:true
})
return personClass2;
})

在编程中,能被当作值来使用的就称为一等公民(firstt-class citizen),意味着它能作为参数传给函数,能作为函数返回值,能用来给变量赋值。JS的函数就是一等公民(一等函数)。

ES6的类也是一等公民,使得类可以被多种方式所使用,例如,作为参数传入函数:

function createObject(classDef){
return new classDef();
} let obj = createObject(class {
sayHi(){
console.log("Hi!");
}
})
obj.sayHi(); //Hi!

 类表达式的另一个用途是立即调用类构造器,用于创建单例,看下面栗子;

let person = new class{
constructor(name){
this.name = name;
}
sayName(){
console.log(this.name);
}
}("miya")
console.log(person.sayName()) //miya

 此处创建了一个匿名表达式,并立即执行了它。此模式允许你使用类语法来创建单例,从而不留下任何可被探查的类引用,类表达式后面的圆括号表示要调用前面的函数,并且还允许传入参数。

在类上创建访问器属性(类似于对象字面量):

 自有属性需要在类构造器中创建,类还允许在原型上定义访问器属性。栗子如下:

class htmlEle{
constructor(ele){
this.ele = ele;
}
get html(){
return this.ele.innerHTML;
}
set html(value){
this.ele.innerHTML = value;
}
}
var des = Object.getOwnPropertyDescriptor(htmlEle.prototype, "html");
console.log("get" in des); //true
console.log("set" in des); //true
console.log(des.enumerable); //false

可计算的成员名:

类里面的方法,以及访问器属性getter和setter都可以被设置为可计算属性名。

生成器方法:

对象的类,其实目的在于让每个实例化后的对象都能共享某些属性。类的实现是基于其原型继承机制的。如果两个实例都从同一个原型对象上面继承了属性,我们就说它们是同一个类的实例。
JavaScript中类的一个重要特性-----动态可继承。

定义类是模块开发和重用代码的有效方式之一。一定得掌握的呦!!!

1,类和原型

类的所有实例对象都是从同一个原型对象上继承属性。原型对象是类的核心。

构造函数是类的公共标识。但原型是唯一的标识。

instanceof运算符检测对象的继承关系,而不是检测创建对象的构造函数。

在JavaScript中定义类的步骤:1,定义一个构造函数,设置初始化新对象的实例属性,2,给构造函数的prototype对象定义实例的方法。3,给构造函数定义类字段和类属性。

【续】

人生最要紧,是活得有趣。  ——梁启超

JS的类的更多相关文章

  1. 一个重构的js分页类

    // JavaScript Document /**//** * js分页类 * @param iAbsolute 每页显示记录数 * @param sTableId 分页表格属性ID值,为Strin ...

  2. 分享非常好用的前端分页js工具类 灵活 简单易懂

    分享自己封装的前端分页js工具类  下面是默认样式效果截图 可以随意更改js及css 很灵活 /** * pageSize, 每页显示数 * pageIndex, 当前页数 * pageCount 总 ...

  3. JS常用类

    JS常用类 一.Number 1.常用数字 整数:10 小数:3.14 科学计数法:1e5 | 1e-5 正负无穷:Infinity | -Infinity 2.常用进制 二进制:0b1010 八进制 ...

  4. JS创建类的方法--简单易懂有实例

    版权声明:本文为博主原创文章,转载请注明出处 Javascript是一种基于对象的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有Class. ...

  5. Vue.js的类Class 与属性 Style如何绑定

    Vue.js的类Class 与属性 Style如何绑定 一.总结 一句话总结:数据绑定一个常见需求是操作元素的 class 列表和它的内联样式.因为它们都是属性,我们可以用 v-bind 处理它们:我 ...

  6. js构建类的方法

    Javascript是一种基于对象的语言,你遇到的所有东西几乎都是对象.但是,它又不是一种真正的面向对象编程(OOP)语言,因为它的语法中没有Class.(不过,ES6引入了Class这个概念,作为对 ...

  7. JS实现 类的 1.判断 2.添加 3.删除 4切换

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  8. JS定义类的六种方式详解

    转载自: http://www.jb51.net/article/84089.htm 在前端开发中,经常需要定义JS类.那么在JavaScript中,定义类的方式有几种,分别是什么呢?本文就JS定义类 ...

  9. JS 工具类

    之前工作用的JavaScript比较多,总结了一下工具类,和大家分享一下,有不足之处还请多多见谅!! 1. 数组工具类(arrayUtils) var arrayUtils = {}; (functi ...

  10. Rhino+envjs-1.2.js 在java运行网站js 工具类

    java爬虫遇到个页面加密的东西,找了些资料学习学习 做了个java运行js的工具类,希望对大家有用,其中用到client(获取js)可以自行换成自己的client.主要是用了 Rhino就是Java ...

随机推荐

  1. 复杂的Polygon

  2. 【转】Vim命令合集

    Vim命令合集 命令历史 以:和/开头的命令都有历史纪录,可以首先键入:或/然后按上下箭头来选择某个历史命令. 启动vim 在命令行窗口中输入以下命令即可 vim 直接启动vim vim filena ...

  3. Linux SSH 使用密钥登陆

    Linux SSH 使用密钥登陆 通常我们登录 Linux 服务器,我们需要使用密码进行登录,但是密码存在被暴力破解的可能. 可以将默认服务端口 22 改成其他不常用的端口. 可以设置非常复杂的密码. ...

  4. python-django框架-电商项目-首页开发_20191122

    python-django框架-电商项目-首页开发 业务背景: 用户浏览网站一定是先到首页, 没有登陆的话首页内容完全一样,而且是不经常变化的, 一段时间内,有100用户访问,就要有几个用户就要查询多 ...

  5. deeplearning.ai 人工智能行业大师访谈

    Geoffrey Hinton 1. 怀揣着对大脑如何存储记忆的好奇,Hinton本科最开始学习生物学和物理学,然后放弃,转而学习哲学:然后觉得哲学也不靠谱,转而学习心理学:然后觉得心理学在解释大脑运 ...

  6. sql 优化之8个尽量

    查询语句的优化是SQL效率优化的一个方式,可以通过优化sql语句来尽量使用已有的索引,避免全表扫描,从而提高查询效率.最近在对项目中的一些sql进行优化,总结整理了一些方法. 1.在表中建立索引,优先 ...

  7. sqlserver开窗函数改造样例

    作一个查询的性能优化. 先清缓存 DBCC DROPCLEANBUFFERS DBCC FREEPROCCACHE 原查询 前人遗留. ) ),) select @total=sum(price*pe ...

  8. JSP_EL的回顾

    在 JSP 页面中,使用标签库代替传统的 Java 片段语言来实现页面的显示逻辑已经不是新技术了,然而,由自定义标签很容易造成重复定义和非标准的实现.鉴于此,出现了 JSTL ( JSP Standa ...

  9. 转-web自动化测试,定位不到元素的原因及解决方案

    1.动态id定位不到元素 分析原因:每次打开页面,ID都会变化.用ID去找元素,每次刷新页面ID都会发生变化. 解决方案:推荐使用xpath的相对路径方法或者cssSelector查找到该元素. 2. ...

  10. Java IO: PipedInputStream

    原文链接 作者: Jakob Jenkov 译者: 李璟(jlee381344197@gmail.com) PipedInputStream可以从管道中读取字节流数据,代码如下: 01 InputSt ...