从C#到TypeScript - 类
总目录
从C#到TypeScript - 类
在ES6之前Javascript的类都是用function定义的,ES6把类关键字正式加进来,虽说其实也还是function,不过代码可读性上好了不少。
TypeScript同样支持class,并且和C#也非常相似,下面来看看:
类
同C#一样,由构造函数,属性,方法组成,属性和方法有三个级别的访问权限:private, protected, public,比C#少个internal。
不过不同的是C#类的成员默认是private,而TypeScript默认是public。
在类里面所有成员都必须用this来访问。
class User{
constructor(name: string, pwd: string){
this.name = name;
this.pwd = pwd;
}
name: string;
private pwd: string;
checkLogin(): boolean{
return this.name === 'brook' && this.pwd === '123';
}
}
let u: User = new User('brook', '123');
console.info(u.checkLogin()); // true
u.name = 'test';
console.info(u.checkLogin()); // false
参数属性
上面的User类有两个成员,而且都是从构造函数赋值的,也就是其实构造函数的参数就是类的成员,这就是参数属性。
类里面的那两个属性其实可以不用写,只要在构造函数的参数上加上操作限定符,TypeScript就会自动为参数生成属性,来重构下上面的User。
class User{
constructor(public name: string, private pwd: string){ }
checkLogin(): boolean{
return this.name === 'brook' && this.pwd === '123';
}
}
getter/setter
同样,也有存取器,不过语法和C#不太一样,写起来稍麻烦些。
只有get的时候也就变成只读属性了。
class User{
private _name: string;
get name(): string{
return this._name;
}
set name(name: string){
this._name = name;
}
}
静态属性和方法
上面说的都是实例成员,TypeScript也支持静态成员,不用实例化,而是通过类名来访问。
class User{
static permission = 'user';
static setPermission(p: string){
User.permission = p;
}
}
console.info(User.permission); // user
User.setPermission('admin');
console.info(User.permission); // admin
也同时支持static和readonly,不过static要放在前面,这样可以实现单例模式。
class User{
static readonly instance = new User();
private constructor(){}
checkLogin(name: string, pwd: string): boolean{
return name === 'brook' && pwd === '123';
}
}
console.info(User.instance.checkLogin('brook', '123'));
抽象类
这点和C#一样,都可以用抽象类来把有共同行为抽象出来,关键字都是abstract。
不能实例化,可以包含实现,abstract标识的方法,继承类必须实现。
但没有virtual关键字,不过和Java一样,可以认为是天生虚函数,也不需要override,直接覆盖也能支持多态。
继承类里要调用父类的函数需要用super关键字。
abstract class User{
name: string;
pwd: string;
abstract checkLogin(): boolean;
checkName(): boolean {
return this.name.indexOf('.') < 0;
}
}
class Admin extends User {
checkLogin(): boolean { // 必须实现的抽象方法
return this.checkName();
}
checkName(): boolean { // 这里会把User里的checkName覆盖掉
return true && super.checkName();
}
}
let user: User;
user = new Admin();
user.name = 'brook.shi';
console.info(user.checkLogin()); // 同样有多态,checkLogin里调用的是Admin的checkName
另外,继承时还需要注意,如果派生类里有构造函数,则构造函数必须要调用父类的构造函数:super()。
兼容性
TypeScript里的类是有兼容性的,这点和C#很不一样,TypeScript认为:只有成员的类型是兼容的,那它们的类型也是兼容的。
不过成员的兼容对于public很宽容,完全不相干的类如果全是public的成员,并且一致就认为是兼容的。
但对于private和protected则只有是继承的才会被认可为兼容。
class Test1{
name: string;
pwd: string;
checkName(): boolean{
return true;
}
}
class Test2{
name: string;
pwd: string;
checkName(): boolean{
return false;
}
}
let t: Test1 = new Test2();
console.info(t.checkName()); // false
如果给上面的Test和Test2各加一个private email: string;,结果是编译不了,因为它们并不是继承关系,也就兼容不了。
泛型
同接口一样支持泛型,用法也一样,可以参考接口泛型。
interface Testable<T> {
field: T;
method(arg: T): T;
}
class Test<T> implements Testable<T>{
field: T;
method(arg: T): T{
console.info(`arg is ${typeof arg}`);
return null;
}
}
let test11 = new Test<string>();
test11.method('method'); // arg is string
test11.method(123); // error, 123 is not string
总的来说,TypeScript的类和C#或Java可以说十分相似,除了兼容性基本上没有什么新的东西,不过对于JavaScript来说却是一大进步了。
从C#到TypeScript - 类的更多相关文章
- .NET手撸绘制TypeScript类图——上篇
.NET手撸绘制TypeScript类图--上篇 近年来随着交互界面的精细化,TypeScript越来越流行,前端的设计也越来复杂,而类图正是用简单的箭头和方块,反映对象与对象之间关系/依赖的好方式. ...
- .NET手撸绘制TypeScript类图——下篇
.NET手撸绘制TypeScript类图--下篇 在上篇的文章中,我们介绍了如何使用.NET解析TypeScript,这篇将介绍如何使用代码将类图渲染出来. 注:以防有人错过了,上篇链接如下:http ...
- TypeScript:类(Classes)
返回TypeScript手册总目录 传统的Javascript关注的是函数(function)和基于原型(prototype-based)的继承作为构建可重复使用组件的基本方式,但是与更舒服地使用面向 ...
- typescript类的修饰符
学习过java的小姐姐,小哥哥应该很好理解,但还是啰嗦的写出来! typescript里面定义属性的时候给我们提供了 三种修饰符 public :公有 在当前类里面. 子类 .类外面都可以访问 pro ...
- typescript类(学习笔记非干货)
我们声明一个 Greeter类.这个类有3个成员:一个叫做greeting的属性,一个构造函数和一个greet方法. We declare a Greeter class. This class ha ...
- typescript类与继承
/* 1.vscode配置自动编译 1.第一步 tsc --inti 生成tsconfig.json 改 "outDir": "./js", 2.第二步 任务 ...
- typescript类 继承 修饰符
//1.ts中类的定义 /* es5: function Person(name){ this.name=name; this.run=function(){ console.log(this.nam ...
- typescript 类(类的定义、继承、修饰符、抽象类)
代码: // 本节内容 // 1.类的定义 // 2.类的继承 // 3.访问修饰符 // 4.静态属性和静态方法 // 5.抽象类和多态 // js // function Person(name) ...
- TypeScript入门四:TypeScript的类(class)
TypeScript类的基本使用(修饰符) TypeScript类的抽象类(abstract) TypeScript类的高级技巧 一.TypeScript类的基本使用(修饰符) TypeScript的 ...
随机推荐
- Android控件系列之RadioButton&RadioGroup
学习目的: 1.掌握在Android中如何建立RadioGroup和RadioButton 2.掌握RadioGroup的常用属性 3.理解RadioButton和CheckBox的区别 4.掌握Ra ...
- ERP软件数据库覆盖数据恢复成功/重装数据库系统软件,导致同名文件覆盖
ERP软件数据库覆盖数据恢复成功/重装数据库系统软件,导致同名文件覆盖 [数据恢复故障描述] 上海某酒店ERP软件原来安装在C盘上,用户误操作把软件进行了卸载,发现软件没有了, 但操作之前没有把原 ...
- Phone APP设计规范/iPad APP设计规范/Android APP设计规范/网页设计规范
原文链接:http://www.ui001.com/chicun/ ①iPhone的设计尺寸 iPhone界面尺寸: 设备 分辨率 状态栏高度 导航栏高度 标签栏(工具栏)高度 iPhone6 plu ...
- mysql5.7.10和mysql5.5.39两个版本对于group by函数的处理差异
原理还是没有搞清楚,在官网上看了一下,看的不是很清楚.一并都记录一下. 问题描述: 存在如下数据结构 sql: 求用户最近更新的那条记录 思路: 按照modify_time排序后按照user_id分组 ...
- 匿名函数里的this的执行环境和指向--javascript
重新看了下闭包,在javascript高级程序设计第二版里的闭包里有如下例子,例子中介绍说匿名函数的执行环境具有全局性和this指向window,对于这句话很费解,所以就想个方法验证下. var na ...
- C#通过socket判断FTP服务器是否通畅并判断用户名密码是否正确
private static ManualResetEvent timeoutObject; private static Socket socket = null; private static b ...
- UVa 757 - Gone Fishing
题目大意:John有h的时间可以去钓鱼,有n湖可钓鱼,以5分钟为时间单位,每个湖初始每个单位时间可钓f条鱼,每下一个时间单位数量减少d条.同时,John只能从1号湖往后走进行钓鱼,湖之间的距离需要t个 ...
- 动态创建Fastreport(delphi)
动态创建Fastreport分以下几个步骤: 1.首先清空Fastreport,定义全局变量,并加载数据集 frReport.Clear; frReport.DataSets.Add(fr ...
- IOS 消息
发送消息: NSDictionary *dict=[[NSDictionary alloc]initWithObjectsAndKeys:@"num",[NSString stri ...
- 25+免费的Bootstrap HTML5网站模板
在前端框架中,Bootstrap可以说是非常有名的高级网站设计框架.网上也有很多使用Bootstrap程序创建的免费模板.这些模板设计成响应式模式,因此你可以使用它们来为所有的设备平台和浏览器创建网站 ...