无论React还是RN都已经迈入了ES6的时代,甚至凭借Babel的支持都进入了ES7。ES6内容很多,本文主要讲解类相关的内容。

构造函数

定义侦探类作为例子。

ES5的“类”是如何定义的。

  1. function ES5Detective() {
  2. console.log('##ES5Detective contructor');
  3. }

ES6定义类:

  1. class ES6Detective {
  2. constructor() {
  3. console.log('Detective constructor');
  4. }
  5. }

ES6使用了class关键字,而且有专门的constructor。ES5里的function ES5Detective既是类的定义,也是构造函数。

属性

看看这个侦探是从哪本书出来的。

ES5:

  1. ES5Detective.prototype.fromBookName = 'who';

ES6:

  1. class ES6Detective {
  2. detectiveName: string;
  3. _bookName: string;
  4. constructor() {
  5. console.log('Detective constructor');
  6. this.detectiveName = 'Detective who'; // 属性
  7. }
  8. }

ES6 getter & setter

  1. class ES6Detective {
  2. detectiveName: string;
  3. _bookName: string;
  4. constructor() {
  5. console.log('Detective constructor');
  6. this.detectiveName = 'Detective who';
  7. this._bookName = 'who';
  8. }
  9. get fromBookName() {
  10. return this._bookName;
  11. }
  12. set fromBookName(value) {
  13. this._bookName = value;
  14. }
  15. }

如果只有getter没有setter而赋值的话就会出现下面的错误:

  1. detective.bookAuthor = 'A C';
  2. ^
  3. TypeError: Cannot set property bookAuthor of #<ES6Detective> which has only a getter

实例方法

侦探是如何解决案件的。

ES5:

  1. ES5Detective.prototype.solveCase = function(caseName) {
  2. var dn = this.dectiveName;
  3. if(!caseName) {
  4. console.log('SOLVE CASE: ' + dn + ' no case to solve');
  5. } else {
  6. console.log('SOLVE CASE: ' + dn + ' get case ' + caseName + ' is solved');
  7. }
  8. };

或者:

  1. function ES5Detective() {
  2. this.dectiveName = 'Detective who';
  3. console.log('##ES5Detective contructor');
  4. // 实例方法
  5. this.investigate = function(scene) {
  6. console.log('investigate ' + scene);
  7. }
  8. this.assistant = "assistant who";
  9. }

ES6:

  1. class ES6Detective {
  2. detectiveName: string;
  3. _bookName: string;
  4. constructor() {
  5. console.log('Detective constructor');
  6. this.detectiveName = 'Detective who';
  7. this._bookName = 'who';
  8. }
  9. solveCase(caseName) {
  10. if(!caseName) {
  11. console.log('no case to solve');
  12. } else {
  13. console.log('case ' + caseName + ' is solved');
  14. }
  15. }
  16. }

ES6添加方法非常简单直接。ES5中添加实例方法有两种方法,一是在prototype里定义,一是在构造函数重定义。在构造函数中定义的实例方法和属性在每一个实例中都会保留一份,而在原型中定义的实例方法和属性是全部实例只有一份。

另外,在ES5的构造函数重定义的实例方法可以访问类的私有变量。比如:

  1. function ES5Detective() {
  2. console.log('##ES5Detective contructor');
  3. var available: boolean = true; // private field. default income is ZERO.
  4. this.investigate = function(scene) {
  5. if (available) {
  6. console.log('investigate ' + scene);
  7. } else {
  8. console.log(`i'm not available`);
  9. }
  10. }
  11. }

在其他的方法访问的时候就会报错。

  1. if (!available) {
  2. ^

静态方法

ES5:

  1. ES5Detective.countCases = function(count) {
  2. if(!count) {
  3. console.log('no case solved');
  4. } else {
  5. console.log(`${count} cases are solved`);
  6. }
  7. };

类名后直接定义方法,这个方法就是静态方法。

  1. ES5Detective.countCases();

ES6:

  1. class ES6Detective {
  2. static countCases() {
  3. console.log(`Counting cases...`);
  4. }
  5. }
  6. // call it
  7. ES6Detective.countCases();

继承

ES6使用extends关键字实现继承。

ES5:

  1. function ES5Detective() {
  2. var available: boolean = true; // private field.
  3. this.dectiveName = 'Detective who';
  4. console.log('##ES5Detective contructor');
  5. this.investigate = function(scene) {
  6. // 略
  7. }
  8. this.assistant = "assistant who";
  9. }
  10. ES5Detective.prototype.solveCase = function(caseName) {
  11. // 略
  12. }
  13. // inheritance
  14. function ES5DetectiveConan() {
  15. // first line in constructor method is a must!!!
  16. ES5Detective.call(this);
  17. this.dectiveName = 'Conan';
  18. }
  19. // inheritance
  20. ES5DetectiveConan.prototype = Object.create(ES5Detective.prototype);
  21. ES5DetectiveConan.prototype.constructor = ES5DetectiveConan;

ES5继承的时候需要注意两个地方:

  1. 需要在子类的构造函数里调用SuperClass.call(this[, arg1, arg2, ...])
  2. 子类的prototype赋值为:SubClass.prototype = Object.create(SuperClass.prototype),然后把构造函数重新指向自己的:SubClass.prototpye.constructor = SubClass。

ES6:

  1. class ES6Detective {
  2. constructor() {
  3. console.log('Detective constructor');
  4. this.detectiveName = 'Detective who';
  5. this._bookName = 'who';
  6. }
  7. solveCase(caseName) {
  8. if(!caseName) {
  9. console.log('no case to solve');
  10. } else {
  11. console.log('case ' + caseName + ' is solved');
  12. }
  13. }
  14. get fromBookName() {
  15. return this._bookName;
  16. }
  17. set fromBookName(value) {
  18. this._bookName = value;
  19. }
  20. get bookAuthor() {
  21. return 'Author Who';
  22. }
  23. static countCases() {
  24. console.log(`Counting cases...`);
  25. }
  26. }
  27. class ES6DetectiveConan extends ES6Detective {
  28. constructor() {
  29. super();
  30. console.log('ES6DetectiveConan constructor');
  31. }
  32. }

ES6的新语法更加易懂。

注意:一定要在子类的构造方法里调用super()方法。否则报错。

调用super类内容

  1. class ES6DetectiveConan extends ES6Detective {
  2. constructor() {
  3. super();
  4. console.log('ES6DetectiveConan constructor');
  5. }
  6. solveCase(caseName) {
  7. super.solveCase(caseName);
  8. if(!caseName) {
  9. console.log('CONAN no case to solve');
  10. } else {
  11. console.log('CONAN case ' + caseName + ' is solved');
  12. }
  13. }
  14. }

静态方法可以被继承

ES6的静态方法可以被继承。ES5的不可以。

  1. class ES6Detective {
  2. static countCases(place) {
  3. let p = !place ? '[maybe]' : place;
  4. console.log(`Counting cases...solve in ${p}`);
  5. }
  6. }
  7. class ES6DetectiveConan extends ES6Detective {
  8. constructor() {
  9. super();
  10. console.log('ES6DetectiveConan constructor');
  11. }
  12. }
  13. // static method
  14. ES6Detective.countCases();
  15. ES6DetectiveConan.countCases('Japan');
  16. // result
  17. Counting cases...solve in [maybe]
  18. Counting cases...solve in Japan

在子类ES6DetectiveConan并没有定义任何方法,包括静态方法。但是,在父类和子类里都可以调用该方法。

甚至,可以在子类里调用父类的静态方法:

  1. class ES6DetectiveConan extends ES6Detective {
  2. static countCases(place) {
  3. let p = !place ? '[maybe]' : place;
  4. super.countCases(p);
  5. console.log(`#Sub class:- Counting cases...solve in ${p}`);
  6. }
  7. }
  8. // result
  9. Counting cases...solve in [maybe]
  10. Counting cases...solve in Japan
  11. #Sub class:- Counting cases...solve in Japan


作者:小红星闪啊闪

来源:51CTO

React Native填坑之旅--class(番外篇)相关推荐

  1. React Native填坑之旅--动画篇

    React Native填坑之旅--Button篇 React Native填坑之旅--动画 React Native填坑之旅--HTTP请求篇 动画是提高用户体验不可缺少的一个元素.恰如其分的动画可 ...

  2. React Native填坑之旅 -- 回归小插曲

    回归RN,非常开心啊! 在React Native 0.49.5上开发,直接遇到一个ios模拟器的问题.这个问题很简单就是Bundle URL not present. 在网上找了很多的解决方法,都不 ...

  3. flutter填坑之旅(环境搭建篇--mac系统)

    上次配置过Mac到flutter环境,但是由于最近系统更新了,什么都没了又得从新配置,发现自己竟然好多都忘记了,看来还是得把它记下来才行 在Mac上安装并运行Flutter 最低要求: 操作系统:ma ...

  4. 一次动态代理的填坑之旅

    转载自  一次动态代理的填坑之旅 背景 想在现有的接口加上熔断降级或者限流的功能,比较好的方式是通过注解的方式,并基于动态代理进行实现,下面代码是Rhino的实现 @Rhino public clas ...

  5. Jenkins项目实战之-MacOS High Sierra自动化打包方案的填坑之旅

    前面我介绍了如何在android和iOS实现公司内部app的自动化打包构建的过程.这里写一个关于这个app自动化打包平台从想法到实践再到放机房平稳运行的一个回忆录.总的来说,在jenkins上实现an ...

  6. 【填坑之旅】手把手教你如何用AndroidStudio上传自己的library到Jcenter库

    [填坑之旅]手把手教你如何用AndroidStudio上传自己的library到Jcenter库 前言:我们在使用AndroidStudio的时候,会经常用到第三方的代码库.引入第三方库的方式无非就是 ...

  7. 《Getting Started with D3》填坑之旅(六):第三章(下)

    Chapter 3. Scales, Axes and Lines(比例尺.坐标轴与线) (接上篇:<Getting Started with D3>填坑之旅(五):第三章(上)) 示例2 ...

  8. AppCode Updating indexes一直不停的填坑之旅

    最近在做APP安装包瘦身,找到了传说中的AppCode神器. AppCode 提供了 Inspect Code 来诊断代码,其中含有查找无用代码的功能.它可以帮助我们查找出 AppCode 中无用的类 ...

  9. yolov5使用2080ti显卡训练是一种什么样的体验我通过vscode搭建linux服务器对python-yolov5-4.0项目进行训练,零基础小白都能看得懂的教程。>>>>>>>>>第二章番外篇

    第二章番外篇:yolov5通过vscode搭建linux服务器对python-yolov5-4.0项目进行训练,零基础小白都能看得懂的教程.YOLOv5搭建的最快搭建方式,踩坑经历详谈 前期准备: 2 ...

  10. 程序猿成长之路番外篇之前后端加解密(rsa+aes混合加解密算法)

    今年国庆前夕接手一个外部项目,说是要保障接口数据安全,数据安全相对容易些,接口安全嘛emmmmm, 这个要考虑加解密算法.白名单之类的问题了.于是打算今天搞一期接口安全为题的成长之路番外篇. 为什么要 ...

最新文章

  1. 我在CSDN的第一个1024
  2. 提领指向不完全类型的指针_望远镜不完全指南:望远镜原理、类型和配件
  3. img设置宽高不生效_便宜 好用 不掉盘 保姆级粒子云刷机攻略
  4. 统计学习方法 学习笔记(五):支持向量机(下)
  5. 汇编软件的安装与实验一
  6. 【转】Azure云存储及存储账户概述***
  7. PP视频播放视频时如何关闭弹屏
  8. freemaker 快速入门
  9. 广告点击率模型中,LR, GBDT+LR, FM, DNN等模型的优点和缺点?实际效果如何?
  10. VC维含义的个人理解
  11. 计算机电子报模板,计算机辅助电气电子线路设计课程设计设计报告排版模板(WIT).doc...
  12. 项目:任务清单(Vuex)
  13. java倒计时_详解java倒计时三种简单实现方式
  14. 130 个相见恨晚的超实用网站
  15. mac虚拟摄像头插件_macOS平台下虚拟摄像头的研发总结
  16. setImageBitmap 图片太大部分机型不显示
  17. bzoj1085 骑士精神
  18. Spring内部方法性能监控器
  19. MATLAB 打开m文件的时候有如图报错怎么办
  20. 计算机应用能力考试 职称,专业技术人员计算机应用能力考试(全国计算机职称考试网)...

热门文章

  1. [IT技术]改变计算技术的伟大算法
  2. Linux电源管理-Autosleep
  3. datetime对应的jdbc mysql_Java连接MySQL数据库
  4. linux内核C -- 第10课:内联函数探究
  5. vuejs2.0从入门到放弃--入门实例(四)
  6. adb server is out of date killing
  7. 51nod 1133 不重叠的线段
  8. php ayyay,在PHP中使用Redis
  9. Minix、UNIX、Linux的区别与联系
  10. 感知机(Perceptron)为什么不能表示异或(XOR)