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 相关文章推荐
关于图片验证码设计的思考
Jan 29 Javascript
JavaScript下申明对象的几种方法小结
Oct 02 Javascript
浅谈JS日期(Date)处理函数
Dec 07 Javascript
JQuery选择器、过滤器大整理
May 26 Javascript
详解JavaScript中void语句的使用
Jun 04 Javascript
基于node.js依赖express解析post请求四种数据格式
Feb 13 Javascript
详解AngularJS1.6版本中ui-router路由中/#!/的解决方法
May 22 Javascript
微信小程序request出现400的问题解决办法
May 23 Javascript
解决百度Echarts图表坐标轴越界的方法
Oct 17 Javascript
webpack 处理CSS资源的实现
Sep 27 Javascript
js函数和this用法实例分析
Mar 13 Javascript
javascript canvas时钟模拟器
Jul 13 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 向访客和爬虫显示不同的内容
2009/11/09 PHP
php实现基于微信公众平台开发SDK(demo)扩展的方法
2014/12/22 PHP
详谈配置phpstorm完美支持Codeigniter(CI)代码自动完成(代码提示)
2017/04/07 PHP
PHP中PCRE正则解析代码详解
2019/04/26 PHP
PHP常见的几种攻击方式实例小结
2019/04/29 PHP
jQuery EasyUI API 中文文档 - ValidateBox验证框
2011/10/06 Javascript
js 调用本地exe的例子(支持IE内核的浏览器)
2012/12/26 Javascript
JS实现从表格中动态删除指定行的方法
2015/03/31 Javascript
js实现网页图片延时加载 提升网页打开速度
2016/01/26 Javascript
微信小程序 wxapp内容组件 icon详细介绍
2016/10/31 Javascript
详解Javascript百度地图接口开发文档中的类和方法
2017/02/07 Javascript
nodeJS(express4.x)+vue(vue-cli)构建前后端分离实例(带跨域)
2017/07/05 NodeJs
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
微信小程序中遇到的iOS兼容性问题小结
2018/11/14 Javascript
VSCode launch.json配置详细教程
2020/06/18 Javascript
JavaScript语法约定和程序调试原理解析
2020/11/03 Javascript
python 测试实现方法
2008/12/24 Python
python分割文件的常用方法
2014/11/01 Python
Python实现Smtplib发送带有各种附件的邮件实例
2017/06/05 Python
在PyCharm下打包*.py程序成.exe的方法
2018/11/29 Python
OpenCV+Python识别车牌和字符分割的实现
2019/01/31 Python
CSS去掉A标签(链接)虚线框的方法
2014/04/01 HTML / CSS
使用html5 canvas绘制圆环动效
2019/06/03 HTML / CSS
英国男士时尚网站:Dandy Fellow
2018/02/09 全球购物
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
三维科技面试题
2013/07/27 面试题
人事主管的岗位职责
2013/11/16 职场文书
企事业单位求职者的自我评价
2013/12/28 职场文书
2014年村党支部工作总结
2014/12/04 职场文书
邹越演讲观后感
2015/06/15 职场文书
单位更名证明
2015/06/18 职场文书
Pandas加速代码之避免使用for循环
2021/05/30 Python
vue route新窗口跳转页面并且携带与接收参数
2022/04/10 Vue.js
mysql5.5中文乱码问题解决的有用方法
2022/05/30 MySQL
阿里云服务器部署RabbitMQ集群的详细教程
2022/06/01 Servers
前端传参数进行Mybatis调用mysql存储过程执行返回值详解
2022/08/14 MySQL