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 相关文章推荐
使用javascript实现ListBox左右全选,单选,多选,全请
Nov 07 Javascript
JavaScript1.6数组新特性介绍以及JQuery的几个工具方法
Dec 06 Javascript
js取值中form.all和不加all的区别介绍
Jan 20 Javascript
javascript的propertyIsEnumerable()方法使用介绍
Apr 09 Javascript
js实现点击添加一个input节点
Dec 05 Javascript
angularJS提交表单(form)
Feb 09 Javascript
ichart.js绘制虚线、平均分虚线效果的实现代码
May 05 Javascript
JS中appendChild追加子节点无效的解决方法
Oct 14 Javascript
详解Vue iview IE浏览器不兼容报错(Iview Bable polyfill)
Jan 07 Javascript
Vue实现拖放排序功能的实例代码
Jul 08 Javascript
微信小程序把百度地图坐标转换成腾讯地图坐标过程详解
Jul 10 Javascript
vue中使用element ui的弹窗与echarts之间的问题详解
Oct 25 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/04/09 PHP
PHP生成Gif图片验证码
2013/10/27 PHP
php socket客户端及服务器端应用实例
2014/07/04 PHP
学习php设计模式 php实现状态模式
2015/12/07 PHP
php生出随机字符串
2017/07/06 PHP
PHP将英文数字转换为阿拉伯数字实例讲解
2019/01/28 PHP
Ext 表单布局实例代码
2009/04/30 Javascript
js判断ie版本号的简单实现代码
2014/03/05 Javascript
jquery获取复选框被选中的值
2014/04/10 Javascript
jQuery实现的简洁下拉菜单导航效果代码
2015/08/26 Javascript
jQuery实现简单滚动动画效果
2016/04/07 Javascript
详解Vue.use自定义自己的全局组件
2017/06/14 Javascript
Vue添加请求拦截器及vue-resource 拦截器使用
2017/11/23 Javascript
浅谈node模块与npm包管理工具
2018/01/03 Javascript
Angular5中提取公共组件之radio list的实例代码
2018/07/10 Javascript
vue-for循环嵌套操作示例
2019/01/28 Javascript
JS精确判断数据类型代码实例
2019/12/18 Javascript
[02:08:58]2014 DOTA2国际邀请赛中国区预选赛 Ne VS CIS
2014/05/22 DOTA
[01:02:05]LGD vs Mineski 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
[01:32]dota2拉比克至宝(222)
2018/12/20 DOTA
python中的对象拷贝示例 python引用传递
2014/01/23 Python
python timestamp和datetime之间转换详解
2017/12/11 Python
Python中py文件引用另一个py文件变量的方法
2018/04/29 Python
python matplotlib 在指定的两个点之间连线方法
2018/05/25 Python
Python函数基础实例详解【函数嵌套,命名空间,函数对象,闭包函数等】
2019/03/30 Python
弄懂这56个Python使用技巧(轻松掌握Python高效开发)
2019/09/18 Python
教你如何用python操作摄像头以及对视频流的处理
2020/10/12 Python
伦敦时尚生活的缩影:LN-CC
2017/01/24 全球购物
Java和Javasciprt的区别
2012/09/02 面试题
J2EE系统只能是基于web
2015/09/08 面试题
大学生操行评语大全
2014/12/31 职场文书
农贸批发市场管理制度
2015/08/07 职场文书
Python列表删除重复元素与图像相似度判断及删除实例代码
2021/05/07 Python
MySQL 常见存储引擎的优劣
2021/06/02 MySQL
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
Python List remove()实例用法详解
2021/08/02 Python