对象和接口-1:对象类型

简介: 本实验将介绍TypeScript中的对象类的基本语法

对象和接口-1:对象类型

1. 创建资源

开始实验之前,您需要先创建实验相关资源。

  1. 在实验室页面,单击创建资源
  2. (可选)在实验室页面左侧导航栏中,单击云产品资源列表,可查看本次实验资源相关信息(例如IP地址、子用户信息等)。

说明:资源创建过程需要3~5分钟视资源不同开通时间有所差异,ACK等资源开通时间较长。完成实验资源的创建后,您可以在云产品资源列表查看已创建的资源信息,例如:子用户名称、子用户密码、AK ID、AK Secret、资源中的项目名称等。

实验环境一旦开始创建则进入计时阶段,建议学员先基本了解实验具体的步骤、目的,真正开始做实验时再进行创建。

资源创建成功,可在左侧的资源卡片中查看相关资源信息以及RAM子账号信息


2. 实验环境操作指南

在本系列实验中,有两种方法可以进行操作。一种是控制台方式,另一种是远程桌面的方式。接下来我们分别介绍这两种操作方式。

控制台方式

使用控制台方式操作实验,上手比较简单,对网络带宽的要求也不高。但是在编辑代码时,需要使用Vim工具进行文本编辑。对于初学者来说使用Vim工具需要熟悉其操作模式。

进入控制台环境

资源创建成功后,我们在右侧选择切换到Web Terminal

切换到dev用户

本次实验的开发环境部署在dev用户的~/web目录中。因此我们执行这两条命令即可进入实验环境

su dev
cd ~/web

Vim工具的用法

vim是一个命令行下的文本编译器。使用vim编辑文件时。我们只需要通过快捷键,而不需要鼠标就可以对文本文件进行编辑。但是这种文本编辑器的用法和常见的图形界面编辑器使用习惯差别较大。接下来我们简单介绍vim的使用。

3.1 进入Vim

在命令行中输入vim即可进入操作界面,这时的Vim没有打开任何文件。

vim

3.2 Vim的三种模式

和普通编译器不同的是,Vim包含了三种操作模式。分别是命令模式编辑模式末行模式。接下来我们来简单介绍一下三种模式的用法。

3.3 命令模式

在刚进入界面的时候,vim默认状态为命令模式。这种模式下,无法编辑文件,键盘输入也不会在屏幕上有任何显示,这种情况往往会让使用者感到困惑。这时候我们可以输入大写的ZZ,即可退出Vim。

3.4 编辑模式

我们继续输入vim回到编辑器。在命令模式下我们按下小写的i。此时我们会发现下部的提示已经变成了插入。这表示vim已经进入了编辑模式。

在编辑模式下我们就可以像正常的编辑器一样编辑文件。此处我们输入hello world

在编辑完成之后,如果我们想退回命令模式,只需要按ECS键即可。按下该按钮之后我们会发现下部的插入提示消失了,这就表示vim回到了命令模式。

3.5 末行模式

回到命令模式之后,我们按下:键,这时下部的提示会变成:,这就表示vim进入了末行模式。在末行模式下,我们同样使用快捷命令操作vim,但是和命令模式不同的是,末行模式中输入的命令会显示的屏幕的最后一行。

接下来我们继续输入w demo.txt并按回车。会提示显示为如下内容。表示上面的内容已经保存到了demo.txt中。

最后我们按:q,该命令也可以退出vim。

4. 编辑index.js文件

4.1 创建新文件

当我们希望编辑特定文件时,我们可以输入vim 文件名。这时候在下部会看到"index.ts" [新]。表示vim自动创建了新文件。

vim index.ts

4.2 复制粘贴

在编辑模式下,vim同样可以使用ctrl+v进行粘贴。我们按i进入编辑模式之后,将下列内容粘贴到vim中。

//vim编辑模式和命令模式的常用命令:
//在编辑模式中:可以使用 上 下 左 右 按键移动光标
//在命令模式中:可以使用 h j k l 命令移动光标
//在编辑模式中:可以使用退格或者DEL键删除字符
//在命令模式中:可以使用 x 命令删除字符
//在命令模式中:可以使用 dd 命令删除整行文字(谨慎使用!)
//在命令模式中:可以使用 ggdG 命令删除全部文字(谨慎使用!)
//在命令模式中:可以使用 u 命令撤销操作
//在命令模式中:可以使用 ctrl + r 命令重做操作。

4.3 文件内容的查找

在命令模式下,除了按:命令之外,还可以使用/命令进入末行模式,通过/进入末行模式之后,输入相关的内容即可进行全文检索。我们在命令模式下输入/dd

光标就会移动到相关字符上。

4.3 文件的保存和放弃

当我们编辑完成之后,可以在命令模式中通过ZZ命令直接保存并退出编辑器,也可以通过在末行模式中通过:w单独保存文件。如果我们希望通过末行模式保存并退出,可以使用:wq

但是需要注意的时,如果文件在修改之后没有保存,是无法通过:q退出的。如果编辑过的文件是只读属性也无法通过ZZ退出。这时我们就可以使用:q!命令放弃所有的编辑内容,强制退出vim。

远程桌面方式

使用远程桌面方式进行实验是,可以使用VS Code编译器进行代码的编写和操作,相对控制台方式更加的直观。但是这种方式对网络带宽的要求比较高。

进入网页环境

1.1 进入远程桌面

资源创建成功后,我们在右侧选择切换到远程桌面

1.2 启动浏览器

在远程桌面页面中,点击Chromium网页浏览器

登录RAM用户

2.1 打开网页

浏览器启动后会默认打开阿里云的RAM用户登录页。在登录页面中我们点击下一步按钮。

2.2 获取密码

接下来我们需要输入RAM用户的密码。密码显示在实验控制台左侧,我们点击子用户密码右侧的复制按钮。

复制完成后,我们在用户密码框中按Ctrl + V 复制密码,然后点击登录按钮

进入ECS的远程连接。

3.1 进入ECS控制台

登录成功后,页面跳转到控制台,我们在控制台的搜索框中输入ECS,然后点击云服务器ECS进入云服务器控制台。

3.2 进入远程连接界面

在ECS控制台中,我们找到实验创建的ECS,点击右侧的远程连接按钮。

3.3 选择VNC远程连接

在远程连接中选择通过VNC远程连接中的立即登录如果没有显示该选项,则可点击展开其他登录方式按钮。

登录VNC远程连接

4.1 初始化VNC密码

初次登录VNC远程连接时需要先设置VNC密码。点击重置VNC密码按钮。

输入两次新的VNC密码,并点击确认

4.2 登录VNC

VNC密码设置成功后,输入密码并点击确认。

4.4 进入图形界面

VNC登录成功后会看到实验ECS的登录界面,在登陆界面中我们点击DEV用户图标

4.5 在图形界面中登录

在密码框中输入默认登录密码Dev12345。即可进入图形实验环境

使用VS Code编辑器

登录图形实验环境之后,接下来我们来启动VS Code 编辑器。

5.1 进入应用程序列表

首先我们点击界面的下方的显示应用程序按钮。

5.2 启动VS Code

在应用程序列表中选择最后一页

然后点击VS Code应用图标

5.3 选择文件

在VS Code 编译器中,左边区域为文件列表,可以选择要编辑的文件

5.4 编辑文件

在VS Code中,右上区域为文件编辑区,可以进行文件内容编辑

5.5 操作终端

在右下区域的终端选项卡,为控制台区域,可以进行命令输入执行


3. 对象的语法

在原生JavaScript中,绝大多数元素都作为对象进行处理。在对象类型中可以包含若干有名字的属性,和数组相比对象类型的可读性要好很多。因此对象是JavaScript中最基础和重要的元素。本节实验我们将介绍对象类型的用法。

  1. 对象的定义

TypeScript中的对象类型为object,但是直接使用object定义的对象不能存储任何属性。因此在实际使用时我们会使用另一种方法,也就通过{}语法来定义对象。这种方式需要在定义时明确对象内的所有属性的名称和类型。对象类型定义后,初始化时需要提供对象内元素的具体值。我们修改index.ts文件为如下内容。

var obj:{a:string};
obj = {a:"Hello World"};
console.log(obj);

终端选项卡中输入如下内容,编译并查看。此处我们使用linux中的&&关键字将两条命令放在一行执行

tsc && node index.js

  1. 属性访问

当我们需要读取或者修改对象内部的元素值的时候,我们可以使用对象名.属性名的语法。我们修改index.ts文件为如下内容。

var obj: { a: string };
obj = { a: "Hello World" };
console.log(obj);
obj.a = "Hello Alibaba"
console.log(obj);
console.log(obj.a);

终端选项卡中输入如下内容,编译并查看。

tsc && node index.js

  1. 函数属性

在TypeScript中所有的元素都可以看作对象,自然也包括函数元素。这就意味者函数不但可以作为变量,同样也可以作为对象的属性。

当函数做为对象的属性时,可以使用普通函数和Lambad表达式两种语法定义属性的类型。普通函数类型的定义语法为标准函数定义去掉function关键字。Lambad表达式的语法和定义函数类型一致。

当我们使用函数属性时,除了使用.语法读取和修改之外,还可以使用对象元素.函数属性()的方式调用函数。需要注意的时,对象在初始化的时候,函数变量和普通变量一样都需要进行初始化赋值。我们修改index.ts文件为如下内容。

var u: {
    user: string;
    login(password: string): void;
    login: (password: string) => void;
}
u = {
    user: "Aliyun",
    login: function (password: string) {
        console.log("password:" + password);
    }
};
u.login("passwd");

终端选项卡输入如下命令编译并查看。

tsc && node index.js


4. 对象、函数、this

在TypeScript的中有一个特殊的对象变量叫做this。在实际开发中我们会经常使用这个变量。但是这个变量的使用逻辑同时涉及到了对象和函数类型。在本小节我们就来介绍一下this对象的用法和逻辑。

需要注意的是在前端网页运行环境和nodejs运行环境中,this对象的定义逻辑并不完全相同,在本实验中我们以nodejs运行环境为主来进行学习。

  1. 对象函数中的this

首先我们来看一下this对象的基本用法,我们定义一个对象,并在其中包含一个函数属性。在该函数属性中,我们就可以使用this对象。这时候的this对象表示的就是函数所在的对象。

当我们使用this对象的时候,同样可以使用.语法来访问其中的属性和函数方法。我们修改index.ts文件为如下内容。

var u: {
    user: string;
    login(password: string): void;
    sayHello: () => string;
}
u = {
    user: "Aliyun",
    login: function (password: string) {
        console.log("this:", this);
        console.log("user:" + this.user + "password:" + password);
        console.log("sayHello:" + this.sayHello());
    },
    sayHello: function () {
        return "hello"
    }
};
u.login("passwd");

终端选项卡中输入如下内容,编译并查看。

tsc && node index.js

  1. this的指向

在上面的步骤中我们可知,使用对象元素.函数名的方式调用函数时,this变量为对象元素本身。但是当我们使用一个函数变量保存对象中的函数属性。然后通过函数变量调用函数时,我们会发现这时候的this变量的为undefined

这是由于在nodejs的函数中,this变量的指向实际上就是函数调用时.前面的对象。如果不是使用.语法进行的函数调用,就无法获得为this变量赋值。我们修改index.ts文件为如下内容。

var u: {
    user: string;
    login(password: string): void;
}
u = {
    user: "Aliyun", login: function (password: string) {
        console.log("this:", this);
  }
};
var l = u.login;
l("passwd");

终端选项卡中输入如下内容,编译并查看。

tsc && node index.js

  1. lambda表达式和this

在上一个小节的学习中我们了解到,对象中的函数属性可以通过标准function语法,或者lambda表达式方法定义。同时我们可以使用两种方法中的任意一种初始化属性。

但是需要注意的时,无论使用哪种方法定义函数属性,只有使用了标准function语法初始化的函数中才可以使用this。在lambda表达式中this并不生效。我们修改index.ts文件为如下内容。

var u: {
    user: string;
    login: (password: string) => void;
}
u = {
    user: "Aliyun", login: function (password: string) {
        console.log("user:" + this.user + "password:" + password);
    }
};
u.login("passwd");
u = {
    user: "Aliyun", login: (password: string) => {
        console.log("user:" + this.user + "password:" + password);
    }
};
u.login("passwd");

终端选项卡中输入如下内容,编译并查看。

tsc


5. 复杂属性的用法

  1. 对象中复杂属性

对象中的属性类型不但可以包括numberstringboolean函数等基本类型,同样可以包括数组,元组甚至另一个对象。我们修改index.ts文件为如下内容。

var obj: {
    person: { name: string, age: number, male: boolean },
    score: number[]
};
obj = {
    person: { name: "alibaba", age: 20, male: false },
    score: [84.5, 90.2, 75.8]
};
console.log(obj);

终端选项卡输入如下命令编译并查看。

tsc && node index.js

  1. 复杂类型选取

在访问复杂类型时,我们可根据对象的类型,将.[]等关键字组合使用。我们修改index.ts文件为如下内容。

var obj: {
    person: { name: string, age: number, male: boolean },
    score: number[]
};
obj = {
    person: { name: "alibaba", age: 20, male: false },
    score: [84.5, 90.2, 75.8]
};
obj.person.name = "ALIBABA"
obj.score.push(100);
console.log(obj.person.name);
console.log(obj.score[3]);
console.log(obj);

终端选项卡输入如下命令编译并查看。

tsc && node index.js

  1. 对象的下标访问方式

除了对象名.属性名语法之外,对象类型还支持和数字类似的对象名["属性名"]语法形式,相对于.语法,这种语法的灵活性会更强。我们修改index.ts文件为如下内容。

var obj: {
    person: { name: string, age: number, male: boolean },
    score: number[]
};
obj = {
    person: { name: "alibaba", age: 20, male: false },
    score: [84.5, 90.2, 75.8]
};
console.log(obj["person"]["name"])
console.log(obj["score"][0])

终端选项卡输入如下命令编译并查看,

tsc && node index.js


6. 特殊属性的用法

TypeScript对象的语法中还包含了一些特殊属性的定义方法。本小节中我们先来学习只读属性和可选属性的语法和语法。

  1. 对象中的只读属性

在实际使用对象元素时,经常会遇到如下情况,我们需要将对象中的某些属性设定为在初始化之后需要保持不变,这些属性一旦被误修改会造成业务逻辑的错误,比如用户ID。

这时候我们就可以使用readonly关键字将这种属性声明为只读,TypeScript的编译器会检查并禁止只读属性在初始化之后的赋值操作,保证只读的属性在初始化之后的不可改变。我们修改index.ts文件为如下内容。

var obj: {
    readonly id: string,
    name: string, age: number, male: boolean
};
obj = { id: "ID0001", name: "alibaba", age: 20, male: false };
obj.id = "ID0002";

终端选项卡输入如下命令编译并查看。

tsc

  1. 只读复杂属性

对于普通的只读属性来说,属性在初始化之后就无法修改。但是对于复杂类型的属性来说。虽然属性在初始化之后无法修改。但是对象属性的属性并不受readonly影响。也就是我们可以修改只读属性的属性和内容。我们修改index.ts文件为如下内容。

var user: {
    readonly id: number[],
    readonly name: { first: string, last: string }
};
user = {
    id: [2022],
    name: { first: "Ali", last: "yun" }
};
console.log(user)
user.name.first = "阿里云";
user.id.push(2023);
console.log(user);

终端选项卡输入如下命令编译并查看。

tsc && node index.js

  1. 可选属性

除了只读属性之外,我们在实际开发过程中还会遇到另一种情况,有的属性值在某些情况下并不需要,或者没有意义。除了使用类型 | undefined的联合类型之外,也可以使用?关键字来标识可选属性。我们修改index.ts文件为如下内容。

var user1, user2: {
    name: string,
    passwd?: string
};
user1 = { name: "ALIYUN"};
console.log(user1)
user2 = { name: "ALIYUN", passwd: "PASSWORD" };
console.log(user2)

终端选项卡输入如下命令编译并查看。会发现passwd是否赋值都不影响对象的初始化。

tsc && node index.js

实验链接:https://developer.aliyun.com/adc/scenario/2441cd7370cb44eba190e577f4aa779a

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
相关文章
|
6月前
|
C++
c++类&对象
c++类&对象
50 3
|
4月前
|
JavaScript 前端开发
理解包装对象类型
理解包装对象类型
27 0
|
6月前
|
存储 C#
C#对象和类
C#对象和类
45 0
|
6月前
|
存储 C++
C++对象和类
C++对象和类
38 0
|
6月前
|
前端开发 编译器 索引
07 # 接口:对象类型接口
07 # 接口:对象类型接口
41 0
|
6月前
|
存储 Java 编译器
第 4 章 对象与类(下)
第 4 章 对象与类
136 0
|
6月前
|
存储 算法 Java
第 4 章 对象与类(上)
第 4 章 对象与类
81 0
|
前端开发
67 # 对象的处理
67 # 对象的处理
34 0
|
弹性计算 JavaScript 开发工具
对象和接口-3:接口类型
本实验将介绍TypeScript中的接口类型
|
编译器 C语言 C++
C++ 类 & 对象
【摘要】 C++ 类 & 对象C++ 在 C 语言的基础上增加了面向对象编程,C++ 支持面向对象程序设计。类是 C++ 的核心特性,通常被称为用户定义的类型。类用于指定对象的形式,它包含了数据表示法和用于处理数据的方法。类中的数据和方法称为类的成员。函数在一个类中被称为类的成员。C++ 类定义定义一个类,本质上是定义一个数据类型的蓝图。这实际上并没有定义任何数据,但它定义了类的名称意味着什么,也就是...