添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
相关文章推荐
俊秀的毛衣  ·  hive 行转 多列 - CSDN文库·  9 月前    · 
紧张的烤面包  ·  java - ...·  1 年前    · 
基于原型prototype的JS,一直在模拟面向对象,
后来ES6引入了class关键字,使JS能够像传统面向对象语言一样创建一个类
在TS中,对ES6的类进行了增强,引入了更多特性

二,定义一个类

使用TS定义一个类:

class Dog {
    constructor(name: string) {
        this.name = name;
    name: string;
    run() {}

与ES不同之处在于

TS为成员属性和构造函数的参数添加了类型注解
run方法默认返回值是void

run
构造函数的返回值类型默认会被推断为Dog,即本类
constructor

注意事项:

1,无论是在ES还是TS中,类的成员属性都是实例属性(而不是原型属性),类的成员方法都是原型方法

打印类的原型,查看是否包含内部属性:

console.log(Dog.prototype)
类的原型不包含内部属性,原型上只有run方法和constructor构造方法

创建一个实例,并打印:

// 创建实例并打印
let dog = new Dog('wanwgang')
console.log(dog)
内部属性name只在实例上,而不在原型上

2,与ES不同,TS实例的属性必须有初始值,或在构造函数中被初始化

如果删掉构造函数中对name的初始化,将提示错误:

class Dog {
    constructor(name: string) {
        // this.name = name;
    name: string;
    run() {}
// Property 'name' has no initializer and is not definitely assigned in the constructor.
// 属性name没有初始化表达式,且未在构造函数中明确赋值

这时可以为name赋一个初始值:

class Dog {
    constructor(name: string) {
        // this.name = name;
    name: string = 'dog';
    run() {}

或设置为可选属性

class Dog {
    constructor(name: string) {
        // this.name = name;
    name?: string ;
    run() {}

总的来说,只要内部属性有初始值,就不会报错

三,类的继承

定义一个哈士奇,继承Dog类
class Husky extends Dog {
    constructor (name: string) {
        super(name)

可以看到:

类的继承使用了extends关键字
类的构造函数constructor中调用了super,代表父类实例
父类Dog的构造函数中有一个参数name,所以子类也必须要有具有此参数

为子类Husky添加独有的color属性(也需要在构造函数中初始化):

class Husky extends Dog {
    constructor (name: string, color: string) {
        super(name)
        this.color = color
    color: string

这样就实现了类的继承

三,类的成员修饰符

类的成员修饰符部分是TS对ES所做的扩展

类的成员修饰符包括以下几种:

1,公有成员-public
类的所有属性默认均为public,表示对所有人可见
class Dog {
    constructor(name: string) {
        this.name = name;
    public name: string;
    run() {}
2,私有成员-private
私有成员只可被类本身调用,不能被实例和子类调用
class Dog {
    constructor(name: string) {
        this.name = name;
    public name: string;    // 公有成员(默认)
    run() {}
    private pri() {}    // 私有成员

实例化对象,并调用私有成员,会报错

提示pri为私有属性,只能在类Dog中访问
let dog = new Dog('wanwgang')
dog.pri() // Property 'pri' is private and only accessible within class 'Dog'.

私有成员也不能在子类中被调用:

class Husky extends Dog {
    constructor (name: string, color: string) {
        super(name)
        this.color = color
        this.pri()	// Property 'pri' is private and only accessible within class 'Dog'.
    color: string

类的构造函数也可以被设置为私有成员

这样做,类就既不能被实例化也不能被继承了
3,受保护成员-protected
受保护成员,只能在类或子类中被访问,不能在类实例中被访问

protected
构造函数也可以被声明为protected

使这个类只能被继承,不能被实例化,相当于声明了一个基类
4,只读属性-protected
类的成员可以被声明为只读
class Dog {
    constructor(name: string) {
        this.name = name;
    name: string = 'dog'
    run() {}
    private pri() {}
    protected pro() {}
    readonly ro: string = "a"  // 只读属性
 和实例属性一样,类的只读属性必须被初始化
5,静态成员-static
class Dog {
    constructor(name: string) {
        this.name = name;
    name: string = 'dog'
    run() {}
    private pri() {}
    protected pro() {}
    readonly ro: string = "a"  // 只读属性

类的静态成员只能通过类名来调用,不能通过子类来调用
static
类的静态成员可以被继承:
static_extends

四,为构造函数的参数添加修饰符

除了类的成员可以添加修饰符外,构造函数的参数也可以添加修饰符

作用:将参数自动变成实例的属性,这样就可以省略在类中的定义

本篇介绍了TS类的相关知识,包含:

	类的声明和实现
	类的成员修饰符
                                    C++ 面向对象编程,和对象,原理,属性,行为,案例,封装,多态,友元,继承,对象特性,函数重载,运算符重载,构造函数,析构函数,初始化列表,浅拷贝和深拷贝,虚函数,虚析构,纯虚析构
                                    javascript的数据型我们都知道, TypeScript支持与JavaScript几乎相同的数据型,此外还提供了实用的枚举型方便我们使用。
1、Typescript的原始数据型
布尔型(boolean)
	let isBool: boolean = false
	let isBool: boolean = true
	// 如果你写成其他型的值,就会提示报错
	let isBool: boolean = 'string'
数值(number)
	let age:num
                                    typescript中的typescript中的和ES6不同的是,TS中属性必须声明,需要指定型。 声明后的属性必须赋值一个默认值或者在构造函数中进行初始化。
以下是es6中定义的示例:
class Person{
    constructor(name,age){
        this.name=name;
        this.age=age;
    sayHello(msg){
        console.log(msg);
以下是types
public :公有访问。不受任何限制。
private : 私有访问。只限于本成员访问,子,实例都不能访问。
protected :保护访问。只限于本和子访问,实例不能访问。
internal :内部访问。只限于本项目内访问,其他不能访问。
protected internal : 内部保护访问。只限于本项目或是子访问,其他不能访问
C#源文件经过CSC.exe把Visual C#程序代码编译成IL中间语言和元数据,编译器编译生成程序集(exe/dll)IL和元数据同时储存在exe或dll 文件中,该伪代码是独立于任何CPU 的,所以只要装有.Net FrameWork的机器均可以运行该伪代码,这就增强了c#代码的可移植性。
程序执行时,
                                    描述了所创建的对象共同的属性和方法。TypeScript 支持继承,即我们可以在创建的时候继承一个已存在的,这个已存在的称为父继承它的称为子。只要一个接口继承了某个, 那么就会继承这个中所有的属性和方法,但是只会继承属性和方法的声明, 不会继承属	性和方法实现继承使用关键字 extends,子除了不能继承的私有成员(方法和属性)和构造函数,其他的都可以继承。extends: 继承某个继承之后可以使用父的方法,也可以重写父的方法。访问器和设置器必须有相同的成员可见性。
                                    看这样一个模板,它生成的使得一个名字和一个t型的对象的指针关联起来。
template<class t>class namedptr {public:namedptr(const string& initname, t *initptr);...private:string name;t *ptr;};
(因为有指针成员的对象在进行拷贝和赋值操作时可能会引起指...