React Native填坑之旅--class(番外篇)
无论React还是RN都已经迈入了ES6的时代,甚至凭借Babel的支持都进入了ES7。ES6内容很多,本文主要讲解类相关的内容。
构造函数
定义侦探类作为例子。
ES5的“类”是如何定义的。
- function ES5Detective() {
- console.log('##ES5Detective contructor');
- }
ES6定义类:
- class ES6Detective {
- constructor() {
- console.log('Detective constructor');
- }
- }
ES6使用了class关键字,而且有专门的constructor。ES5里的function ES5Detective既是类的定义,也是构造函数。
属性
看看这个侦探是从哪本书出来的。
ES5:
- ES5Detective.prototype.fromBookName = 'who';
ES6:
- class ES6Detective {
- detectiveName: string;
- _bookName: string;
- constructor() {
- console.log('Detective constructor');
- this.detectiveName = 'Detective who'; // 属性
- }
- }
ES6 getter & setter
- class ES6Detective {
- detectiveName: string;
- _bookName: string;
- constructor() {
- console.log('Detective constructor');
- this.detectiveName = 'Detective who';
- this._bookName = 'who';
- }
- get fromBookName() {
- return this._bookName;
- }
- set fromBookName(value) {
- this._bookName = value;
- }
- }
如果只有getter没有setter而赋值的话就会出现下面的错误:
- detective.bookAuthor = 'A C';
- ^
- TypeError: Cannot set property bookAuthor of #<ES6Detective> which has only a getter
实例方法
侦探是如何解决案件的。
ES5:
- ES5Detective.prototype.solveCase = function(caseName) {
- var dn = this.dectiveName;
- if(!caseName) {
- console.log('SOLVE CASE: ' + dn + ' no case to solve');
- } else {
- console.log('SOLVE CASE: ' + dn + ' get case ' + caseName + ' is solved');
- }
- };
或者:
- function ES5Detective() {
- this.dectiveName = 'Detective who';
- console.log('##ES5Detective contructor');
- // 实例方法
- this.investigate = function(scene) {
- console.log('investigate ' + scene);
- }
- this.assistant = "assistant who";
- }
ES6:
- class ES6Detective {
- detectiveName: string;
- _bookName: string;
- constructor() {
- console.log('Detective constructor');
- this.detectiveName = 'Detective who';
- this._bookName = 'who';
- }
- solveCase(caseName) {
- if(!caseName) {
- console.log('no case to solve');
- } else {
- console.log('case ' + caseName + ' is solved');
- }
- }
- }
ES6添加方法非常简单直接。ES5中添加实例方法有两种方法,一是在prototype里定义,一是在构造函数重定义。在构造函数中定义的实例方法和属性在每一个实例中都会保留一份,而在原型中定义的实例方法和属性是全部实例只有一份。
另外,在ES5的构造函数重定义的实例方法可以访问类的私有变量。比如:
- function ES5Detective() {
- console.log('##ES5Detective contructor');
- var available: boolean = true; // private field. default income is ZERO.
- this.investigate = function(scene) {
- if (available) {
- console.log('investigate ' + scene);
- } else {
- console.log(`i'm not available`);
- }
- }
- }
在其他的方法访问的时候就会报错。
- if (!available) {
- ^
静态方法
ES5:
- ES5Detective.countCases = function(count) {
- if(!count) {
- console.log('no case solved');
- } else {
- console.log(`${count} cases are solved`);
- }
- };
类名后直接定义方法,这个方法就是静态方法。
- ES5Detective.countCases();
ES6:
- class ES6Detective {
- static countCases() {
- console.log(`Counting cases...`);
- }
- }
- // call it
- ES6Detective.countCases();
继承
ES6使用extends关键字实现继承。
ES5:
- function ES5Detective() {
- var available: boolean = true; // private field.
- this.dectiveName = 'Detective who';
- console.log('##ES5Detective contructor');
- this.investigate = function(scene) {
- // 略
- }
- this.assistant = "assistant who";
- }
- ES5Detective.prototype.solveCase = function(caseName) {
- // 略
- }
- // inheritance
- function ES5DetectiveConan() {
- // first line in constructor method is a must!!!
- ES5Detective.call(this);
- this.dectiveName = 'Conan';
- }
- // inheritance
- ES5DetectiveConan.prototype = Object.create(ES5Detective.prototype);
- ES5DetectiveConan.prototype.constructor = ES5DetectiveConan;
ES5继承的时候需要注意两个地方:
- 需要在子类的构造函数里调用SuperClass.call(this[, arg1, arg2, ...])
- 子类的prototype赋值为:SubClass.prototype = Object.create(SuperClass.prototype),然后把构造函数重新指向自己的:SubClass.prototpye.constructor = SubClass。
ES6:
- class ES6Detective {
- constructor() {
- console.log('Detective constructor');
- this.detectiveName = 'Detective who';
- this._bookName = 'who';
- }
- solveCase(caseName) {
- if(!caseName) {
- console.log('no case to solve');
- } else {
- console.log('case ' + caseName + ' is solved');
- }
- }
- get fromBookName() {
- return this._bookName;
- }
- set fromBookName(value) {
- this._bookName = value;
- }
- get bookAuthor() {
- return 'Author Who';
- }
- static countCases() {
- console.log(`Counting cases...`);
- }
- }
- class ES6DetectiveConan extends ES6Detective {
- constructor() {
- super();
- console.log('ES6DetectiveConan constructor');
- }
- }
ES6的新语法更加易懂。
注意:一定要在子类的构造方法里调用super()方法。否则报错。
调用super类内容
- class ES6DetectiveConan extends ES6Detective {
- constructor() {
- super();
- console.log('ES6DetectiveConan constructor');
- }
- solveCase(caseName) {
- super.solveCase(caseName);
- if(!caseName) {
- console.log('CONAN no case to solve');
- } else {
- console.log('CONAN case ' + caseName + ' is solved');
- }
- }
- }
静态方法可以被继承
ES6的静态方法可以被继承。ES5的不可以。
- class ES6Detective {
- static countCases(place) {
- let p = !place ? '[maybe]' : place;
- console.log(`Counting cases...solve in ${p}`);
- }
- }
- class ES6DetectiveConan extends ES6Detective {
- constructor() {
- super();
- console.log('ES6DetectiveConan constructor');
- }
- }
- // static method
- ES6Detective.countCases();
- ES6DetectiveConan.countCases('Japan');
- // result
- Counting cases...solve in [maybe]
- Counting cases...solve in Japan
在子类ES6DetectiveConan并没有定义任何方法,包括静态方法。但是,在父类和子类里都可以调用该方法。
甚至,可以在子类里调用父类的静态方法:
- class ES6DetectiveConan extends ES6Detective {
- static countCases(place) {
- let p = !place ? '[maybe]' : place;
- super.countCases(p);
- console.log(`#Sub class:- Counting cases...solve in ${p}`);
- }
- }
- // result
- Counting cases...solve in [maybe]
- Counting cases...solve in Japan
- #Sub class:- Counting cases...solve in Japan
作者:小红星闪啊闪
来源:51CTO
React Native填坑之旅--class(番外篇)相关推荐
- React Native填坑之旅--动画篇
React Native填坑之旅--Button篇 React Native填坑之旅--动画 React Native填坑之旅--HTTP请求篇 动画是提高用户体验不可缺少的一个元素.恰如其分的动画可 ...
- React Native填坑之旅 -- 回归小插曲
回归RN,非常开心啊! 在React Native 0.49.5上开发,直接遇到一个ios模拟器的问题.这个问题很简单就是Bundle URL not present. 在网上找了很多的解决方法,都不 ...
- flutter填坑之旅(环境搭建篇--mac系统)
上次配置过Mac到flutter环境,但是由于最近系统更新了,什么都没了又得从新配置,发现自己竟然好多都忘记了,看来还是得把它记下来才行 在Mac上安装并运行Flutter 最低要求: 操作系统:ma ...
- 一次动态代理的填坑之旅
转载自 一次动态代理的填坑之旅 背景 想在现有的接口加上熔断降级或者限流的功能,比较好的方式是通过注解的方式,并基于动态代理进行实现,下面代码是Rhino的实现 @Rhino public clas ...
- Jenkins项目实战之-MacOS High Sierra自动化打包方案的填坑之旅
前面我介绍了如何在android和iOS实现公司内部app的自动化打包构建的过程.这里写一个关于这个app自动化打包平台从想法到实践再到放机房平稳运行的一个回忆录.总的来说,在jenkins上实现an ...
- 【填坑之旅】手把手教你如何用AndroidStudio上传自己的library到Jcenter库
[填坑之旅]手把手教你如何用AndroidStudio上传自己的library到Jcenter库 前言:我们在使用AndroidStudio的时候,会经常用到第三方的代码库.引入第三方库的方式无非就是 ...
- 《Getting Started with D3》填坑之旅(六):第三章(下)
Chapter 3. Scales, Axes and Lines(比例尺.坐标轴与线) (接上篇:<Getting Started with D3>填坑之旅(五):第三章(上)) 示例2 ...
- AppCode Updating indexes一直不停的填坑之旅
最近在做APP安装包瘦身,找到了传说中的AppCode神器. AppCode 提供了 Inspect Code 来诊断代码,其中含有查找无用代码的功能.它可以帮助我们查找出 AppCode 中无用的类 ...
- yolov5使用2080ti显卡训练是一种什么样的体验我通过vscode搭建linux服务器对python-yolov5-4.0项目进行训练,零基础小白都能看得懂的教程。>>>>>>>>>第二章番外篇
第二章番外篇:yolov5通过vscode搭建linux服务器对python-yolov5-4.0项目进行训练,零基础小白都能看得懂的教程.YOLOv5搭建的最快搭建方式,踩坑经历详谈 前期准备: 2 ...
- 程序猿成长之路番外篇之前后端加解密(rsa+aes混合加解密算法)
今年国庆前夕接手一个外部项目,说是要保障接口数据安全,数据安全相对容易些,接口安全嘛emmmmm, 这个要考虑加解密算法.白名单之类的问题了.于是打算今天搞一期接口安全为题的成长之路番外篇. 为什么要 ...
最新文章
- 我在CSDN的第一个1024
- 提领指向不完全类型的指针_望远镜不完全指南:望远镜原理、类型和配件
- img设置宽高不生效_便宜 好用 不掉盘 保姆级粒子云刷机攻略
- 统计学习方法 学习笔记(五):支持向量机(下)
- 汇编软件的安装与实验一
- 【转】Azure云存储及存储账户概述***
- PP视频播放视频时如何关闭弹屏
- freemaker 快速入门
- 广告点击率模型中,LR, GBDT+LR, FM, DNN等模型的优点和缺点?实际效果如何?
- VC维含义的个人理解
- 计算机电子报模板,计算机辅助电气电子线路设计课程设计设计报告排版模板(WIT).doc...
- 项目:任务清单(Vuex)
- java倒计时_详解java倒计时三种简单实现方式
- 130 个相见恨晚的超实用网站
- mac虚拟摄像头插件_macOS平台下虚拟摄像头的研发总结
- setImageBitmap 图片太大部分机型不显示
- bzoj1085 骑士精神
- Spring内部方法性能监控器
- MATLAB 打开m文件的时候有如图报错怎么办
- 计算机应用能力考试 职称,专业技术人员计算机应用能力考试(全国计算机职称考试网)...
热门文章
- [IT技术]改变计算技术的伟大算法
- Linux电源管理-Autosleep
- datetime对应的jdbc mysql_Java连接MySQL数据库
- linux内核C -- 第10课:内联函数探究
- vuejs2.0从入门到放弃--入门实例(四)
- adb server is out of date killing
- 51nod 1133 不重叠的线段
- php ayyay,在PHP中使用Redis
- Minix、UNIX、Linux的区别与联系
- 感知机(Perceptron)为什么不能表示异或(XOR)