ES6 javascript中class静态方法、属性与实例属性用法示例


Posted in Javascript onOctober 30, 2017

本文实例讲述了ES6 javascript中class静态方法、属性与实例属性用法。分享给大家供大家参考,具体如下:

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

class Foo {
  static classMethod() {
    return 'hello';
  }
}
Foo.classMethod() // 'hello'
var foo = new Foo();
foo.classMethod()
// TypeError: foo.classMethod is not a function

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

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

class Foo {
  static classMethod() {
    return 'hello';
  }
}
class Bar extends Foo {}
Bar.classMethod(); // 'hello'

上面代码中, 父类Foo有一个静态方法, 子类Bar可以调用这个方法。
静态方法也是可以从super对象上调用的。

class Foo {
  static classMethod() {
    return 'hello';
  }
}
class Bar extends Foo {
  static classMethod() {
    return super.classMethod() + ', too';
  }
}
Bar.classMethod();

静态属性

静态属性指的是 Class 本身的属性, 即Class.propname, 而不是定义在实例对象( this) 上的属性。

class Foo {}
Foo.prop = 1;
Foo.prop // 1

上面的写法为Foo类定义了一个静态属性prop。

目前, 只有这种写法可行, 因为 ES6 明确规定, Class 内部只有静态方法, 没有静态属性。

// 以下两种写法都无效
class Foo {
  // 写法一
  prop: 2
    // 写法二
  static prop: 2
}
Foo.prop // undefined

ES7 有一个静态属性的提案, 目前 Babel 转码器支持。

这个提案对实例属性和静态属性, 都规定了新的写法。

(1) 类的实例属性

类的实例属性可以用等式, 写入类的定义之中。

class MyClass {
  myProp = 42;
  constructor() {
    console.log(this.myProp); // 42
  }
}

上面代码中, myProp就是MyClass的实例属性。 在MyClass的实例上, 可以读取这个属性。

以前, 我们定义实例属性, 只能写在类的constructor方法里面。

class ReactCounter extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }
}

上面代码中, 构造方法constructor里面, 定义了this.state属性。
有了新的写法以后, 可以不在constructor方法里面定义。

class ReactCounter extends React.Component {
  state = {
    count: 0
  };
}

这种写法比以前更清晰。

为了可读性的目的, 对于那些在constructor里面已经定义的实例属性, 新写法允许直接列出。

class ReactCounter extends React.Component {
  constructor(props) {
    super(props);
    this.state = {
      count: 0
    };
  }
  state;
}

(2) 类的静态属性

类的静态属性只要在上面的实例属性写法前面, 加上static关键字就可以了。

class MyClass {
static myStaticProp = 42;
constructor() {
console.log(MyClass.myProp); // 42
}
}

同样的, 这个新写法大大方便了静态属性的表达。

// 老写法
class Foo {}
Foo.prop = 1;
// 新写法
class Foo {
  static prop = 1;
}

上面代码中, 老写法的静态属性定义在类的外部。 整个类生成以后, 再生成静态属性。 这样让人很容易忽略这个静态属性, 也不符合相关代码应该放在一起的代码组织原则。 另外, 新写法是显式声明( declarative), 而不是赋值处理, 语义更好。

更多相关内容可查看本站专题:《ECMAScript6(ES6)入门教程》、《JavaScript数组操作技巧总结》、《JavaScript字符与字符串操作技巧总结》、《JavaScript数据结构与算法技巧总结》、《JavaScript错误与调试技巧总结》及《JavaScript数学运算用法总结》

希望本文所述对大家基于ECMAScript的程序设计有所帮助。

Javascript 相关文章推荐
js自带函数备忘 数组
Dec 29 Javascript
WebGame《逆转裁判》完整版 代码下载(1月24日更新)
Jan 29 Javascript
js常用排序实现代码
Dec 28 Javascript
Lazy Load 延迟加载图片的jQuery插件中文使用文档
Oct 18 Javascript
JQuery的Ajax中Post方法传递中文出现乱码的解决方法
Oct 21 Javascript
javascript中关于&& 和 || 表达式的小技巧分享
Apr 10 Javascript
js和jQuery设置Opacity半透明 兼容IE6
May 24 Javascript
AngularJs Understanding the Controller Component
Sep 02 Javascript
详解在vue-cli中引用jQuery、bootstrap以及使用sass、less编写css
Nov 08 jQuery
微信小程序使用progress组件实现显示进度功能【附源码下载】
Dec 12 Javascript
移动端手指操控左右滑动的菜单
Sep 08 Javascript
通过javascript实现扫雷游戏代码实例
Feb 09 Javascript
用React实现一个完整的TodoList的示例代码
Oct 30 #Javascript
JavaScript实现精美个性导航栏筋斗云效果
Oct 29 #Javascript
vue中的scope使用详解
Oct 29 #Javascript
Vue.js划分组件的方法
Oct 29 #Javascript
vue.js  父向子组件传参的实例代码
Oct 29 #Javascript
vue.js todolist实现代码
Oct 29 #Javascript
javascript按钮禁用和启用的效果实例代码
Oct 29 #Javascript
You might like
PHP学习笔记 用户注册模块用户类以及验证码类
2011/09/20 PHP
VIM中设置php自动缩进为4个空格的方法详解
2013/06/14 PHP
php GUID生成函数和类
2014/03/10 PHP
Node.js静态文件服务器改进版
2016/01/10 Javascript
jquery easyui datagrid实现增加,修改,删除方法总结
2016/05/25 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
JavaScript定时器实现的原理分析
2016/12/06 Javascript
概述一个页面从输入URL到页面加载完的过程
2016/12/16 Javascript
JSONP基础知识详解
2017/03/19 Javascript
利用C/C++编写node.js原生模块的方法教程
2017/07/07 Javascript
前端图片懒加载(lazyload)的实现方法(提高用户体验)
2017/08/21 Javascript
使用Vue-Router 2实现路由功能实例详解
2017/11/14 Javascript
监听element-ui table滚动事件的方法
2019/03/26 Javascript
Vue Cli 3项目使用融云IM实现聊天功能的方法
2019/04/19 Javascript
[04:02]DOTA2上海特锦赛小组赛第二日recap精彩回顾
2016/02/28 DOTA
[02:38]DOTA2亚洲邀请赛小组赛精彩集锦:Wings完美团击溃对手
2017/03/29 DOTA
python爬虫入门教程之点点美女图片爬虫代码分享
2014/09/02 Python
python使用in操作符时元组和数组的区别分析
2015/05/19 Python
Django-Rest-Framework 权限管理源码浅析(小结)
2018/11/12 Python
windows下 兼容Python2和Python3的解决方法
2018/12/05 Python
python实现整数的二进制循环移位
2019/03/08 Python
Django使用 Bootstrap 样式修改书籍列表过程解析
2019/08/09 Python
python创建子类的方法分析
2019/11/28 Python
Python3.7.0 Shell添加清屏快捷键的实现示例
2020/03/23 Python
css3模拟jq点击事件的实例代码
2017/07/06 HTML / CSS
CSS3简单实现照片墙
2014/12/12 HTML / CSS
介绍一下EJB的分类及其各自的功能及应用
2016/08/23 面试题
Java基础面试题
2014/07/19 面试题
德尔福集团DELPHI的笔试题
2012/02/22 面试题
医德医魂心得体会
2014/09/11 职场文书
党的群众路线对照检查材料(个人)
2014/09/24 职场文书
爱心捐助活动总结
2015/05/09 职场文书
2015年初中教师个人工作总结
2015/07/21 职场文书
SpringBoot整合Minio文件存储
2022/04/03 Java/Android
部分武汉产收音机展览
2022/04/07 无线电
MySQL范围查询优化的场景实例详解
2022/06/10 MySQL