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 匿名调用实现代码
Jun 19 Javascript
页面加载完成后再执行JS的jquery写法以及区别说明
Feb 22 Javascript
js跨浏览器的事件侦听器和事件对象的使用方法
Dec 17 Javascript
js密码强度检测
Jan 07 Javascript
js中获取键盘事件的简单实现方法
Oct 10 Javascript
jQuery 获取select选中值及清除选中状态
Dec 13 Javascript
微信小程序 滚动到某个位置添加class效果实现代码
Apr 19 Javascript
vue中各组件之间传递数据的方法示例
Jul 27 Javascript
vue技术分享之你可能不知道的7个秘密
Apr 09 Javascript
解决vue项目router切换太慢问题
Jul 19 Javascript
Vue使用v-viewer实现图片预览
Oct 21 Javascript
微信小程序实现登录注册功能
Dec 29 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
首页四格,首页五格For6.0(GBK)(UTF-8)[12种组合][9-18][版主安装测试通过]
2007/09/24 PHP
PHP实现事件机制的方法
2015/07/10 PHP
使用Yii2实现主从数据库设置
2016/11/20 PHP
php命名空间设计思想、用法与缺点分析
2019/07/17 PHP
php设计模式之观察者模式实例详解【星际争霸游戏案例】
2020/03/30 PHP
JavaScript 特殊字符
2007/04/05 Javascript
JQuery优缺点分析说明
2011/04/10 Javascript
js中事件的处理与浏览器对象示例介绍
2013/11/29 Javascript
javascript实现可全选、反选及删除表格的方法
2015/05/15 Javascript
基于jQuery实现的美观星级评论打分组件代码
2015/10/30 Javascript
javascript跨域总结之window.name实现的跨域数据传输
2015/11/01 Javascript
基于javascript实现listbox左右移动
2016/01/29 Javascript
JavaScript中数组添加值和访问值常见问题
2016/02/06 Javascript
jQuery绑定自定义事件的魔法升级版
2016/06/30 Javascript
js实现添加可信站点、修改activex安全设置,禁用弹出窗口阻止程序
2016/08/17 Javascript
JS手机端touch事件计算滑动距离的方法示例
2017/10/26 Javascript
vue计算属性computed的使用方法示例
2019/03/13 Javascript
Vue组件通信的几种实现方法
2019/04/25 Javascript
vue data引入本地图片的两种方式小结
2019/11/13 Javascript
基于vue+element实现全局loading过程详解
2020/07/10 Javascript
Vue 的 v-model用法实例
2020/11/23 Vue.js
[04:03]辉夜杯主赛事 12月25日RECAP精彩回顾
2015/12/26 DOTA
Python中使用dom模块生成XML文件示例
2015/04/05 Python
Python的Flask框架中Flask-Admin库的简单入门指引
2015/04/07 Python
AI人工智能 Python实现人机对话
2017/11/13 Python
python网络爬虫之如何伪装逃过反爬虫程序的方法
2017/11/23 Python
python使用turtle库绘制奥运五环
2020/02/24 Python
Python处理mysql特殊字符的问题
2020/03/02 Python
小学教师事迹材料
2014/01/13 职场文书
12月红领巾广播稿
2014/02/13 职场文书
平安建设工作方案
2014/06/02 职场文书
培养联系人考察意见
2015/06/01 职场文书
运动会广播稿100字
2015/08/19 职场文书
Java数组与堆栈相关知识总结
2021/06/29 Java/Android
Java 定时任务技术趋势简介
2022/05/04 Java/Android
SpringCloud超详细讲解Feign声明式服务调用
2022/06/21 Java/Android