面向对象是typescript的核心部分,这里先介绍下面向对象的七大原则:

  • 单一原则:一个类子负责一个职责。
  • 里氏替换原则:子类可以在任何地方替换它的父类。
  • 依赖倒置原则:代码要依赖于抽象的类,而不要依赖于具体的类;要针对接口或抽象类编程,而不是针对具体类编程。
  • 接口隔离原则:提供尽可能小的单独接口,而不要提供大的总接口。暴露行为让后面的实现类知道的越少越好。
  • 迪米特法则:尽量降低类与类之间的耦合。
  • 开闭原则:面向扩展开放,面向修改关闭
  • 组合/聚合复用原则:尽量使用合成/聚合达到复用,尽量少用继承。原则: 一个类中有另一个类的对象。

这里不作详细的介绍去百度面向对象的七大原则有很多文章很详细《面向对象原则综述》,这里简单描述下概念;

es6中类的声明:

class Demo {
constructor(a, b) {
this.a = a;
this.b = b;
} print() {
console.log(this.a + ' ' + this.b);
}
}

typeScript中类的声明:

class Demo {
public a:string;
public b:string;
constructor(a:string, b:string) {
this.a = a;
this.b = b;
} print() {
console.log(this.a + ' ' + this.b);
}
}

根据单一原则,类的拆分粗细程度一定程度上是开发人的主观选择,举个前端会经常遇到的例子,验证包括姓名验证,电话验证,数字验证,邮件验证,日期验证等等。这些验证是放在类中处理好点还是每一种单独声明一个类更合适呢?放在类中处理会使验证方法的复用率低,造成代码冗余。每个验证都声明一个类又换感觉类很多。《Learning TypeScript》中提议是一个验证声明一个类。代码如下:

class Email{
private email:string;
constructor(email:string){
if(this.validateEmail(email)){
this.email=email;
}else{
throw new Error("Invalid email!");
}
}
private validateEmail(email:string):boolean{
var re=/\S+@\S+\.\S+/
return re.test(email);
}
get():string{
return this.email;
} }
class Person{
public name:string;
public age:number;
public email:Email;
constructor(name:strng,age:number,email:Email){
this.name=name;
this.age=age;
this.email=email;
}
}

这样邮件的验证就是在Email中验证格式。

继承

typescript中继承的实现方式为

class Person{
public name:string;
public age:number;
constructor(name:strng,age:number){
this.name=name;
this.age=age;
}
cons(text:string){
console.log(`Hi! ${this.name},${text}`);
}
}
class Man extends Person{
sex:string;
constructor(name:strng,age:number,sex:string;){
super(name,age)
this.sex=sex
}
cons(text:string){
super.cons(`man,${text}`)
}
}
let sam = new Person("li lei",12);
let tom: Person = new Man("小明",20);

例子中派生类包含了一个构造函数,它 必须调用 super(),它会执行基类的构造函数。 而且,在构造函数里访问 this的属性之前,我们 一定要调用 super()。 这个是TypeScript强制执行的一条重要规则。Man继承Person,并且重写了cons方法,方法中调用了父类的cons方法。

类属性权限修饰符

  • public(默认)公共属性:派生类、类的实例对象都可以访问。
class Person{
public name:string;
public age:number;
constructor(name:strng,age:number){
this.name=name;
this.age=age;
}
cons(text:string){
console.log(`Hi! ${this.name},${text}`);
}
}
  • private 私有属性:派生类、类的实例对象不可以访问。
class Person{
private name:string;
public age:number;
constructor(name:strng,age:number){
this.name=name;
this.age=age;
}
cons(text:string){
console.log(`Hi! ${this.name},${text}`);
}
}
new Person("Cat",12).name; // 错误: 'name' 是私有的.
  • protected 保护属性:派生类可以访问、类的实例对象不可以访问。
class Person{
protected name:string;
public age:number;
constructor(name:strng,age:number){
this.name=name;
this.age=age;
}
}
class Man extends Person{
sex:string;
constructor(name:strng,age:number,sex:string;){
super(name,age)
this.sex=sex
}
cons(text:string){
console.log(`Hi! ${this.name},${text}`);
}
}
new Man("Cat",12).name; // 错误,name是保护属性
  • readonly 修饰符:readonly关键字将属性设置为只读的。
class Person{
readonly name:string;
public age:number;
constructor(name:strng,age:number){
this.name=name;
this.age=age;
}
}
let dad =new Person("Cat",12);
dad.name = "小明"; // 错误! name 是只读的.

存取器

TypeScript支持通过getters/setters来截取对对象成员的访问。

class Person{
private _name:string;
get name():string{
return this._name;
}
set name(name:string){
this._name=name;
}
}
let man = new Employee();
man.name='小明';

参考书籍文档:

typeScript面对对象篇一的更多相关文章

  1. typeScript面对对象篇二

    接口 接触过面向对象的后端语言的应该对接口很熟悉,只接触过前端的对接口会有点陌生,在维基百科中对OOP中接口的定义是这样的: 在面向对象的语言中,术语interface经常被用来定义一个不包含数据和逻 ...

  2. Javascript面对对象. 第一篇

    Javascript,有两个种开发模式: 1.函数式(过程化)2.面对对象(oop),面对对象语言有一个标志,就是类,而通过类可以创建任何多个属性和方法,而Ecmascript没有类的概念,因此它的对 ...

  3. js面对对象编程(二):属性和闭包

    上篇博客中解说了一些js对象的基本概念和使用方法.这篇博客解说一下js属性方面的:公有属性.私有属性,特权方法. 假设学过java.公有属性.私有属性,特权方法(即能够訪问和设置私有属性的方法)一定非 ...

  4. 跟着百度学PHP[4]OOP面对对象编程-7-OOP的一些关键子讲解

    面对对象常用的一些关键子:http://www.cnblogs.com/xishaonian/p/6146794.html排版不是很好望见谅. THE END

  5. [TypeScript] JSON对象转TypeScript对象范例

    [TypeScript] JSON对象转TypeScript对象范例 Playground http://tinyurl.com/nv4x9ak Samples class DataTable { p ...

  6. python面对对象编程----2:__init__

    面对对象编程估计我们最早接触到的就是__init__了,也就是实例的初始化处理过程: 1:来看看最基础的__init__ class Card(object): #抽象类Card,并不用于实例化 de ...

  7. Java入门——(2)面对对象(上)

      关键词:面对对象.类..构造方法.this.static.内部类   一.面对对象的概念:把解决的问题安装一定规则划分为多个独立的对象,然后通过调用对象的方法来解决问题.其特点可概括为封装性.继承 ...

  8. Day-8: 面对对象编程

    面对过程的程序设计方法意在将函数分成子函数,再依次调用这些函数来解决问题. 而面对对象的程序设计方法,来源于自然界,类是实例的抽象,实例是类的具体.自定义出来的对象是类,而所有的数据都可以看成是对象, ...

  9. java基础--面对对象

    面对对象--概述 什么是对象? +---->对象可以泛指一切现实中存着的事物 +---->类是对象的抽象集合 什么是面对对象? +--->万物皆对象,面对对象实际就是人与万物接触== ...

随机推荐

  1. -1-6 java 异常简单介绍 java异常 异常体系 Throwable 分类 throws和throw 异常处理 自定义异常

      异常   异常:异常就是Java程序在运行过程中出现的错误. 异常由来:问题也是现实生活中一个具体事务,也可以通过java 的类的形式进行描述,并封装成对象. 其实就是Java对不正常情况进行描述 ...

  2. Django 系列博客(九)

    Django 系列博客(九) 前言 本篇博客介绍 Django 模板的导入与继承以及导入导入静态文件的几种方式. 模板导入 模板导入 语法:``{% include '模板名称' %} 如下: < ...

  3. Python之celery的简介与使用

    celery的简介   celery是一个基于分布式消息传输的异步任务队列,它专注于实时处理,同时也支持任务调度.它的执行单元为任务(task),利用多线程,如Eventlet,gevent等,它们能 ...

  4. WPF 视频教程+笔记

    视频  https://www.bilibili.com/video/av46071366/ 笔记  https://www.cnblogs.com/Time_1990/p/4015716.html

  5. git合并两个不同的仓库

    目前开发是2个仓库,线上仓库online_a(对应的branch分支为online),测试环境online_b(对应的branch分支为demo),测试环境需要时刻保持onine_a上的最新稳定稳定代 ...

  6. Maven(十一)导入手动创建的Maven 工程

    传统的导入方式并不能导入手动创建的Maven工程 因为eclipse项目必须有如图所示文件,才被认为是Eclipse工程 使用Maven方式导入 导入选项中并没有把项目复制到工作空间的选项,这是与传统 ...

  7. MySQL查询执行的基础——查询优化处理

    查询的生命周期的下一步是将一个SQL转换成一个可执行计划,MySQL再按照这个计划和存储引擎进行交互 语法解析器和预处理 首先,MySQL通过关键词将SQL语句进行解析,并生成一颗对应的"解 ...

  8. Vue开篇之Vue-cli搭建项目

    介绍 Vue.js是一套构建用户界面的渐进式框架.Vue 只关注视图层,采用自底向上增量开发的设计.Vue 的目标是通过尽可能简单的 API 实现响应的数据绑定和组合的视图组件. 第一步:安装node ...

  9. PJSUA2开发文档--第三章 PJSUA2高级API

    3. PJSUA2高级API PJSUA2是PJSUA API以上的面向对象抽象.它为构建会话发起协议(SIP)多媒体用户代理应用程序(也称为IP / VoIP软电话)提供高级API.它将信令,媒体和 ...

  10. The account that is running SQL Server Setup does not have one or all of the following rights: the right to back up files and directories, the right to manage auditing and the security log and the rig

    安装SQL SERVER 是规则检查提示权限问题 运行secpol.msc,没有Debug program权限,添加即可,如果已加域则要在域策略修改,或退域安装后在加域.