众所周知,TypeScript中的class是由原来的构造函数升级而来,那么,class中的成员又对应原来构造函数的哪些部分呢?今天就让我们来解构一下TypeScript中的class吧。

一、声明一个class

我们会使用typescript来声明一个class,这个class基本上包含了class所能有的静态成员、实例成员,并用typescript将class降级到es5,因为es5并没有class的存在,降级后class就是用原来的构造函数实现的,ts代码与js代码如下:

ts代码:

class MyClass {constructor(){this.abc = "abc"} //构造函数//声明的两个属性头static static_prop = "static_prop" //静态成员prop = "prop"               //实例成员//声明的两个属性尾//声明的两个方法头static static_method(){} //静态成员method(){}   //这里是实例成员吗?//声明的两个方法尾
}

由ts生成的js代码:

"use strict";
var MyClass = /** @class */ (function () {function MyClass() {this.prop = "prop"; //实例成员this.abc = "abc";} //构造函数//声明的两个属性尾//声明的两个方法头MyClass.static_method = function () { }; //静态成员MyClass.prototype.method = function () { }; //这里是实例成员吗?//声明的两个属性头MyClass.static_prop = "static_prop"; //静态成员return MyClass;
}());

由于ts代码生成js代码会打乱代码布局,还执行了一个并没有什么软用的立即执行函数,所以为了便于观看,我将会js代码里的注释删除并做一定修饰。

修饰后的js代码

"use strict";function MyClass() {this.prop = "prop";this.abc = "abc";
} MyClass.static_method = function () { }; MyClass.prototype.method = function () { };MyClass.static_prop = "static_prop";

二、解构constructor

可以看到ts里的constructor函数函数体里的语句到了构造函数函数体里。语句如下:

this.abc = "abc";

这就很明显了,class里的constructor函数与构造函数function MyClass()的作用是大致相同的。

三、解构class中的static_prop属性

该属性在ts代码中,是在class内部并且被一个关键字static所修饰,而在js代码却被移动到了class外并且static关键字被移除。两者的代码对比如下:

//ts代码
class MyClass {static static_prop = "static_prop" //在class内部,并且被static修饰
}//js代码function MyClass() {}
MyClass.static_prop = "static_prop"; //在class外部,并且static修饰被移除

观察js代码后发现被static修饰的static_prop属性是其实是被挂载到了构造函数MyClass上

关键字被移除原因是整个属性是在class的外部被声明实现的,自然不能用static关键字,而且es5还没有class这种东西。

所以我们可以总结出,被static关键字修饰的class成员,是被挂载到了class身上,其实也就是原来的构造函数身上,与实例对象、原型对象无关。所以无论实例化出多少个对象,它都是不变的,它是一种比较静态的属性,它可以被称为class的静态成员。

四、解构class中的prop属性

这个属性没有被任何的关键字修饰,ts与js代码对比如下:

//ts
class MyClass {prop = "prop"
}//js
"use strict";function MyClass() {this.prop = "prop";
} 

通过观察js代码,我们可以看出,prop属性是一个实例中的属性。

所以我们可以认为没有static关键字修饰的class属性,是class的实例的一个属性,这种属性可以被称为class的实例成员。

五、解构class的static_method方法

该方法的ts和js代码如下:

//ts
class MyClass {static static_method(){} //静态成员
}//js
function MyClass() {}
MyClass.static_method = function () { }; 

可以看到被statci修饰的class方法static_method和被static修饰的class属性static_prop一样,在js中也是被挂载到了function MyClass()这个构造函数上,是一个静态成员

六、解构class的method方法

该方法没有被任何关键字修饰,ts和js代码如下:

//ts
class MyClass {method(){}
}//js
function MyClass() {} MyClass.prototype.method = function () { };

通过观察js代码,我们可以发现,method方法既不挂载在构造函数上,也不挂载在实例对象上,而是挂载在构造函数的原型对象上,因此我们很难将这个函数称为静态成员或者是实例成员。

七、总结

经过上述解构,我们不难发现,class上被static修饰属性或方法是挂载在class上也就是挂载在构造函数上的。没有被修饰的属性是挂载实例对象上。没有被修饰的方法是挂载在原型对象上的。constructor中的语句会被合并到构造函数函数体中。这就是class与构造函数的对应关系

解构TypeScript中class相关推荐

  1. es6中数组的解构_ES6中的数组解构简介

    es6中数组的解构 by Kevwe Ochuko 通过Kevwe Ochuko Destructuring in JavaScript is a simplified method of extra ...

  2. 【javascript】js解构赋值中使用别名

    let person = {name:"沉默小管",age:18 } //js的解构,把name别名成myName,之后就可以使用myName替换name let {name:my ...

  3. 【英语:基础高阶_经典外刊阅读】L5.解构阅读中段落—匹配类题目详解

    1.信息匹配题型 阅读中的信息匹配类题目主要考查我们对文章的整体内容和结构以及上下文逻辑意义的理解和掌握. 在高考英语.四六级.雅思托福等主流考试中均有相关题目的考点, 但在不同类别的考试中出题的形式 ...

  4. TypeScript入门教程 之 解构

    TypeScript入门教程 之 解构 TypeScript支持以下形式的解构(以解构的名义命名,即分解结构): 对象分解 阵列解构 人们很容易将解构视为结构的逆.JavaScript中的结构化方法是 ...

  5. 如何在 JavaScript 中使用对象解构

    对象解构是一个有用的 JavaScript 功能,用于从对象中提取属性并将其绑定到变量. 更好的是,对象解构可以在一个语句中提取多个属性,可以从嵌套对象访问属性,并且可以在属性不存在时设置默认值. 在 ...

  6. es6数组里面获取某个值对_ES6:解构——JavaScript 从数组和对象中提取数据的文雅要领...

    转载请说明出处,保存原文链接以及作者信息 ES6 有许多新特征,它很大程度上提升了 JavaScript 的编程体验,而且也通知外界,JavaScript 照旧强势. 个中一个新特征是其对数组和对象的 ...

  7. JavaScript中的解构赋值(详细)

    解构赋值,就是快速的从对象或者数组中取出成员的一个语法方式     1.解构:将对象或者数组中的某个成员取出来     2.赋值:取出来的成员赋值给某一个变量 1.数组的解构      使用 [ ] ...

  8. TypeScript基础-数组结构和对象解构

    解构数组 Typescript 数组解构和JavaScript类似 let input = [1, 2]; let [first, second, three] = input; console.lo ...

  9. javascript语法_了解JavaScript中的解构,剩余参数和传播语法

    javascript语法 The author selected the COVID-19 Relief Fund to receive a donation as part of the Write ...

最新文章

  1. 2022年人工智能全球最具影响力学者榜单AI 2000
  2. 1984年王安微型计算机,王安简:今年中科大少年班最小的学生
  3. su: user tomcat does not exist
  4. 谁能跳出数字化系统困境?
  5. 新电脑怎么分盘_【磁盘分区教程】如何给电脑进行分区?
  6. 魔抓编程_编程中的魔数是什么?
  7. 《InfoGAN: Interpretable Representation Learning》翻译
  8. 数字滤波器的研究背景
  9. 奇怪的吃播_快来围观那些奇怪的吃播!!
  10. transition 属性
  11. JS,统计图表大全--十一、甘特图
  12. idea run with coverage异常
  13. 苹果微信多开_微信双开是什么?是不是需要两个手机号?
  14. 佳能eosr控制环能否计算机控制,EOS R有哪些隐藏功能
  15. 北交 操作系统 课程笔记(一)
  16. xp支持python最高版本是多少_PYQT5-开发向下兼容到xp系统的windows软件
  17. sql自动生成汉语拼音和首字母函数[转载]
  18. 新品发布 | 无人车开发平台Autopilot kit R300正式发布!
  19. Excel如何制作工资表
  20. 39岁的阿里P9程序员被裁了,存下了1.5亿...

热门文章

  1. matlab solve 解的范围,matlab怎么解方程,如何规定解的范围?
  2. Wilson定理推论
  3. FT、DFT、FFT
  4. 二分图的匹配——匈牙利算法
  5. (模拟信号/数字信号)分别以(模拟信号/数字信号)中传输方式
  6. PHP用curl请求网址的code码
  7. 线性表(1)普通线性表
  8. 对硬盘操作的API介绍以及应用测试
  9. java开源saas项目
  10. iOS 作为蓝牙外设广播信息