1,构造函数

  1. function Point(x, y) {
  2. this.x = x;
  3. this.y = y;
  4. }
  5.  
  6. Point.prototype.toString = function () {
  7. return '(' + this.x + ', ' + this.y + ')';
  8. };
  9.  
  10. var p = new Point(1, 2);
  11.  
  12. console.log(p)
  13. console.log(p.toString)
  14.  
  15. 效果等同于
  16.  
  17. function Point(x, y) {
  18. this.x = x;
  19. this.y = y;
  20. this.toString = function () {
  21. return '(' + this.x + ', ' + this.y + ')';
  22. };
  23. }
  24.  
  25. var p = new Point(1, 2);
  26.  
  27. console.log(p)
  28. console.log(p.toString)
  29.  
  30. 但是意义不一样,前者定义在生成对象的原型中;
  31. 后者直接定义在属性中

结果:

可见:

  1. 1、构造函数也是一个普通函数,创建方式和普通函数一样,但构造函数习惯上首字母大写
  2.  
  3. 2、构造函数和普通函数的区别在于:调用方式不一样。作用也不一样(构造函数用来新建实例对象)
  4.  
  5. 3、调用方式不一样。
  6. a. 普通函数的调用方式:直接调用 person();
  7. b.构造函数的调用方式:需要使用new关键字来调用 new Person();
  8.  
  9. 4、构造函数的函数名与类名相同:Person( ) 这个构造函数,Person 既是函数名,也是这个对象的类名
  10.  
  11. 5内部用this 来构造属性和方法

2,class:

ES6 的class可以看作只是一个语法糖,它的绝大部分功能,ES5 都可以做到,新的class写法只是让对象原型的写法更加清晰、更像面向对象编程的语法而已。下面的代码等同于以上es5的第一种写法。

  1. class Point {
  2. constructor(x, y) {
  3. this.x = x;
  4. this.y = y;
  5. }
  6.  
  7. toString() {
  8. return '(' + this.x + ', ' + this.y + ')';
  9. }
  10. }

上面代码定义了一个“类”,可以看到里面有一个constructor方法,这就是构造方法,而this关键字则代表实例对象。也就是说,ES5 的构造函数Point,对应 ES6 的Point类的构造方法。

Point类除了构造方法,还定义了一个toString方法。注意,定义“类”的方法的时候,前面不需要加上function这个关键字,直接把函数定义放进去了就可以了。另外,方法之间不需要逗号分隔,加了会报错。

ES6 的类,完全可以看作构造函数的另一种写法。

  1. class Point {
  2. // ...
  3. }
  4.  
  5. typeof Point // "function"
  6. Point === Point.prototype.constructor // true

上面代码表明,类的数据类型就是函数,类本身就指向构造函数。

使用的时候,也是直接对类使用new命令,跟构造函数的用法完全一致。

  1. class Bar {
  2. doStuff() {
  3. console.log('stuff');
  4. }
  5. }
  6.  
  7. var b = new Bar();
  8. b.doStuff() // "stuff"

构造函数的prototype属性,在 ES6 的“类”上面继续存在。事实上,类的所有方法都定义在类的prototype属性上面。

  1. class Point {
  2. constructor() {
  3. // ...
  4. }
  5.  
  6. toString() {
  7. // ...
  8. }
  9.  
  10. toValue() {
  11. // ...
  12. }
  13. }
  14.  
  15. // 等同于
  16.  
  17. Point.prototype = {
  18. constructor() {},
  19. toString() {},
  20. toValue() {},
  21. };

在类的实例上面调用方法,其实就是调用原型上的方法。

  1. class B {}
  2. let b = new B();
  3.  
  4. b.constructor === B.prototype.constructor // true

上面代码中,bB类的实例,它的constructor方法就是B类原型的constructor方法。

2.1 Object.assign添加class方法

由于类的方法都定义在prototype对象上面,所以类的新方法可以添加在prototype对象上面。Object.assign方法可以很方便地一次向类添加多个方法。

  1. class Point {
  2. constructor(){
  3. // ...
  4. }
  5. }
  6.  
  7. Object.assign(Point.prototype, {
  8. toString(){},
  9. toValue(){}
  10. });

2.2静态方法:static

类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。

  1. class Foo {
  2. static classMethod() {
  3. return 'hello';
  4. }
  5. }
  6.  
  7. Foo.classMethod() // 'hello'
  8.  
  9. var foo = new Foo();
  10. foo.classMethod()
  11. // TypeError: foo.classMethod is not a function

上面代码中,Foo类的classMethod方法前有static关键字,表明该方法是一个静态方法,可以直接在Foo类上调用(Foo.classMethod()),而不是在Foo类的实例上调用。如果在实例上调用静态方法,会抛出一个错误,表示不存在该方法。

注意,如果静态方法包含this关键字,这个this指的是类,而不是实例。

(类的方法内部如果含有this,它默认指向类的实例。但是,必须非常小心,一旦单独使用该方法,很可能报错。

解决方案:1,在构造方法中绑定this;2,使用箭头函数;3,使用Proxy)

  1. class Foo {
  2. static bar() {
  3. this.baz();
  4. }
  5. static baz() {
  6. console.log('hello');
  7. }
  8. baz() {
  9. console.log('world');
  10. }
  11. }
  12.  
  13. Foo.bar() // hello

上面代码中,静态方法bar调用了this.baz,这里的this指的是Foo类,而不是Foo的实例,等同于调用Foo.baz。另外,从这个例子还可以看出,静态方法可以与非静态方法重名。

父类的静态方法,可以被子类继承。

静态方法也是可以从super对象上调用的。

2.3实例属性的新写法

2.4静态属性

2.5私有方法和私有属性

2.6new.target 属性

引用自 http://es6.ruanyifeng.com/#docs/class

可参考另一篇博文:https://www.cnblogs.com/wangtong111/p/11242557.html

es6的class关键字与es5的构造函数的更多相关文章

  1. ES6中class关键字

    1 .介绍 //定义类 class Point { constructor(x, y) { this.x = x; this.y = y; } toString() { return '(' + th ...

  2. es6中的类及es5类的实现

    目录 类的特点 类的特点 1.类只能通过new得到 在es6中类的使用只能是通过new,如果你将它作为一个函数执行,将会报错. //es6的写法 class Child { constructor() ...

  3. 用es6的class关键字定义一个类

    es6新增class关键字使用方法详解. 通过class关键字,可以定义类.基本上,ES6的class可以看作只是一个语法糖,它的绝大部分功能,ES5都可以做到,新的class写法只是让对象原型的写法 ...

  4. 一个例子理解ES6的yield关键字

    yield是什么 yield是ES6的新关键字,使函数暂停执行. 一个简单例子 function *countASb() { console.log('Show0:'); var a1 = yield ...

  5. ES6学习之关键字

    前言:什么是ES6?ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.其中相比较于ES5新增了诸多的特性,并且ES6可转换为ES5的语法.- ...

  6. ES6 let const 关键字

    ECMAScript 和 JavaScript的关系? 前者是后者的规格,后者是前者的实现. 符合ECMAScript 规格的还有 Flash 中的AcionScript 和 TypeScript. ...

  7. 浅谈ES6中super关键字

    作用: super 关键字用于访问父对象上的函数. 语法: super([arguments]); // 访问父对象上的构造函数 super.functionOnParent([arguments]) ...

  8. es6的箭头函数和es5的function函数区别

    一.es6的箭头函数es6箭头函数内部没有this,使用时会上朔寻找最近的this不可以做构造函数,不能使用new命令,因为没有this函数体内没有arguments,可以使用rest参数代替不能用y ...

  9. ES6 let const关键字

    在es6中,引入了let和const关键字: 1.letES6 新增了let命令,用来声明变量.它的用法类似于var,但是所声明的变量,只在let命令所在的代码块内有效. (1)在块级作用域里有效(比 ...

随机推荐

  1. hibernate update-->参数绑定

    Hibernate 更新数据库 参数绑定总结: 一.query.setParameter(属性名,真实值,类型); String hql="update User u set u.userN ...

  2. nginx正常启动,ip直接访问失败问题

    1.查看iptables服务示范启动 service iptables status 2.没有安装的话安装 yum install iptables-services 3.修改配置文件, 添加一行: ...

  3. Java学习:identityHashCode和hashCode方法

    System类提供了一个identityHashCode(Object x)方法,这个方法返回的是指定对象的精确hashCode值,也就是根据该对象的地址计算得到的hashCode值. 当某个类的ha ...

  4. go依赖包管理工具vendor基础

    go依赖包管理工具vendor基础 vendor是go的依赖包管理工具,主要用于管理项目中使用到的一些依赖. 它将项目依赖的包,特指外部包,复制到当前工程下的vendor目录下,这样go build的 ...

  5. 深入理解java虚拟机(3)垃圾收集器与内存分配策略

    一.根搜索算法: (1)定义:通过一系列名为"GC Roots"的对象作为起点,从这些起点开始向下搜索,搜索走过的路径称为引用链,当一个对象到GC Roots没有任何引用链相连的时 ...

  6. 解决错误:无法在web.xml或使用此应用程序部署的jar文件中解析绝对uri:[http://shiro.apache.org/tags]

    服务器错误信息如下: 解决方法: 把shiro包中的tld文件(shiro.tld)解压出来放到WEB-INF文件夹下即解决问题. 参考:http://blog.sina.com.cn/s/blog_ ...

  7. neutron网络服务部署

    控制节点执行 #第一步 登陆数据库 mysql -u root -p #导入neutron这个库 CREATE DATABASE neutron; #创建neutron这个用户和密码,并允许本地登陆和 ...

  8. BZOJ[3252]攻略(长链剖分)

    BZOJ[3252]攻略 Description 题目简述:树版[k取方格数] 众所周知,桂木桂马是攻略之神,开启攻略之神模式后,他可以同时攻略k部游戏.今天他得到了一款新游戏<XX半岛> ...

  9. VxWorks引导启动过程

    https://blog.csdn.net/phunxm/article/details/6979089

  10. 常用的webpack 配置

    const path = require('path'); let HtmlWebpackPlugin = require('html-webpack-plugin'); let VueLoaderP ...