TypeScript 類(lèi)
TypeScript 是面向?qū)ο蟮?JavaScript。
類(lèi)描述了所創(chuàng)建的對(duì)象共同的屬性和方法。
TypeScript 支持面向?qū)ο蟮乃刑匦裕热?類(lèi)、接口等。
TypeScript 類(lèi)定義方式如下:
class class_name { // 類(lèi)作用域 }
定義類(lèi)的關(guān)鍵字為 class,后面緊跟類(lèi)名,類(lèi)可以包含以下幾個(gè)模塊(類(lèi)的數(shù)據(jù)成員):
- 字段 ? 字段是類(lèi)里面聲明的變量。字段表示對(duì)象的有關(guān)數(shù)據(jù)。
- 構(gòu)造函數(shù) ? 類(lèi)范例化時(shí)調(diào)用,可以為類(lèi)的對(duì)象分配內(nèi)存。
- 方法 ? 方法為對(duì)象要執(zhí)行的操作。
創(chuàng)建一個(gè) Person 類(lèi):
class Person { }
編譯以上代碼,得到以下 JavaScript 代碼:
var Person = /** @class */ (function () { function Person() { } return Person; }());
1. 創(chuàng)建類(lèi)的數(shù)據(jù)成員
以下范例我們聲明了類(lèi) Car,包含字段為 engine,構(gòu)造函數(shù)在類(lèi)范例化后初始化字段 engine。
this 關(guān)鍵字表示當(dāng)前類(lèi)范例化的對(duì)象。注意構(gòu)造函數(shù)的參數(shù)名與字段名相同,this.engine 表示類(lèi)的字段。
此外我們也在類(lèi)中定義了一個(gè)方法 disp()。
class Car { // 字段 engine:string; // 構(gòu)造函數(shù) constructor(engine:string) { this.engine = engine } // 方法 disp():void { console.log("發(fā)動(dòng)機(jī)為 : "+this.engine) } }
編譯以上代碼,得到以下 JavaScript 代碼:
var Car = /** @class */ (function () { // 構(gòu)造函數(shù) function Car(engine) { this.engine = engine; } // 方法 Car.prototype.disp = function () { console.log("發(fā)動(dòng)機(jī)為 : " + this.engine); }; return Car; }());
2. 創(chuàng)建實(shí)例化對(duì)象
我們使用 new 關(guān)鍵字來(lái)實(shí)例化類(lèi)的對(duì)象,語(yǔ)法格式如下:
var object_name = new class_name([ arguments ])
類(lèi)實(shí)例化時(shí)會(huì)調(diào)用構(gòu)造函數(shù),例如:
var obj = new Car("Engine 1")
類(lèi)中的字段屬性和方法可以使用 . 號(hào)來(lái)訪問(wèn):
// 訪問(wèn)屬性 obj.field_name // 訪問(wèn)方法 obj.function_name()
以下范例創(chuàng)建來(lái)一個(gè) Car 類(lèi),然后通過(guò)關(guān)鍵字 new 來(lái)創(chuàng)建一個(gè)對(duì)象并訪問(wèn)屬性和方法:
class Car { // 字段 engine:string; // 構(gòu)造函數(shù) constructor(engine:string) { this.engine = engine } // 方法 disp():void { console.log("函數(shù)中顯示發(fā)動(dòng)機(jī)型號(hào) : "+this.engine) } } // 創(chuàng)建一個(gè)對(duì)象 var obj = new Car("XXSY1") // 訪問(wèn)字段 console.log("讀取發(fā)動(dòng)機(jī)型號(hào) : "+obj.engine) // 訪問(wèn)方法 obj.disp()
編譯以上代碼,得到以下 JavaScript 代碼:
var Car = /** @class */ (function () { // 構(gòu)造函數(shù) function Car(engine) { this.engine = engine; } // 方法 Car.prototype.disp = function () { console.log("函數(shù)中顯示發(fā)動(dòng)機(jī)型號(hào) : " + this.engine); }; return Car; }()); // 創(chuàng)建一個(gè)對(duì)象 var obj = new Car("XXSY1"); // 訪問(wèn)字段 console.log("讀取發(fā)動(dòng)機(jī)型號(hào) : " + obj.engine); // 訪問(wèn)方法 obj.disp();
輸出結(jié)果為:
讀取發(fā)動(dòng)機(jī)型號(hào) : XXSY1 函數(shù)中顯示發(fā)動(dòng)機(jī)型號(hào) : XXSY1
3. 類(lèi)的繼承
TypeScript 支持繼承類(lèi),即我們可以在創(chuàng)建類(lèi)的時(shí)候繼承一個(gè)已存在的類(lèi),這個(gè)已存在的類(lèi)稱為父類(lèi),繼承它的類(lèi)稱為子類(lèi)。
類(lèi)繼承使用關(guān)鍵字 extends,子類(lèi)除了不能繼承父類(lèi)的私有成員(方法和屬性)和構(gòu)造函數(shù),其他的都可以繼承。
TypeScript 一次只能繼承一個(gè)類(lèi),不支持繼承多個(gè)類(lèi),但 TypeScript 支持多重繼承(A 繼承 B,B 繼承 C)。
語(yǔ)法格式如下:
class child_class_name extends parent_class_name
類(lèi)的繼承:范例中創(chuàng)建了 Shape 類(lèi),Circle 類(lèi)繼承了 Shape 類(lèi),Circle 類(lèi)可以直接使用 Area 屬性:
class Shape { Area:number constructor(a:number) { this.Area = a } } class Circle extends Shape { disp():void { console.log("圓的面積: "+this.Area) } } var obj = new Circle(223); obj.disp()
編譯以上代碼,得到以下 JavaScript 代碼:
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var Shape = /** @class */ (function () { function Shape(a) { this.Area = a; } return Shape; }()); var Circle = /** @class */ (function (_super) { __extends(Circle, _super); function Circle() { return _super !== null && _super.apply(this, arguments) || this; } Circle.prototype.disp = function () { console.log("圓的面積: " + this.Area); }; return Circle; }(Shape)); var obj = new Circle(223); obj.disp();
輸出結(jié)果為:
圓的面積: 223
需要注意的是子類(lèi)只能繼承一個(gè)父類(lèi),TypeScript 不支持繼承多個(gè)類(lèi),但支持多重繼承,如下范例:
class Root { str:string; } class Child extends Root {} class Leaf extends Child {} // 多重繼承,繼承了 Child 和 Root 類(lèi) var obj = new Leaf(); obj.str ="hello" console.log(obj.str)
編譯以上代碼,得到以下 JavaScript 代碼:
var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var Root = /** @class */ (function () { function Root() { } return Root; }()); var Child = /** @class */ (function (_super) { __extends(Child, _super); function Child() { return _super !== null && _super.apply(this, arguments) || this; } return Child; }(Root)); var Leaf = /** @class */ (function (_super) { __extends(Leaf, _super); function Leaf() { return _super !== null && _super.apply(this, arguments) || this; } return Leaf; }(Child)); // 多重繼承,繼承了 Child 和 Root 類(lèi) var obj = new Leaf(); obj.str = "hello"; console.log(obj.str);
輸出結(jié)果為:
hello
4. 繼承類(lèi)的方法重寫(xiě)
類(lèi)繼承后,子類(lèi)可以對(duì)父類(lèi)的方法重新定義,這個(gè)過(guò)程稱之為方法的重寫(xiě)。
其中 super 關(guān)鍵字是對(duì)父類(lèi)的直接引用,該關(guān)鍵字可以引用父類(lèi)的屬性和方法。
class PrinterClass { doPrint():void { console.log("父類(lèi)的 doPrint() 方法。") } } class StringPrinter extends PrinterClass { doPrint():void { super.doPrint() // 調(diào)用父類(lèi)的函數(shù) console.log("子類(lèi)的 doPrint()方法。") } }
編譯以上代碼,得到以下 JavaScript 代碼:
var obj = new StringPrinter() obj.doPrint() var __extends = (this && this.__extends) || (function () { var extendStatics = function (d, b) { extendStatics = Object.setPrototypeOf || ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) || function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; }; return extendStatics(d, b); }; return function (d, b) { extendStatics(d, b); function __() { this.constructor = d; } d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); }; })(); var PrinterClass = /** @class */ (function () { function PrinterClass() { } PrinterClass.prototype.doPrint = function () { console.log("父類(lèi)的 doPrint() 方法。"); }; return PrinterClass; }()); var StringPrinter = /** @class */ (function (_super) { __extends(StringPrinter, _super); function StringPrinter() { return _super !== null && _super.apply(this, arguments) || this; } StringPrinter.prototype.doPrint = function () { _super.prototype.doPrint.call(this); // 調(diào)用父類(lèi)的函數(shù) console.log("子類(lèi)的 doPrint()方法。"); }; return StringPrinter; }(PrinterClass)); var obj = new StringPrinter(); obj.doPrint();
輸出結(jié)果為:
父類(lèi)的 doPrint() 方法。 子類(lèi)的 doPrint()方法。
5. static 關(guān)鍵字
static 關(guān)鍵字用于定義類(lèi)的數(shù)據(jù)成員(屬性和方法)為靜態(tài)的,靜態(tài)成員可以直接通過(guò)類(lèi)名調(diào)用。
class StaticMem { static num:number; static disp():void { console.log("num 值為 "+ StaticMem.num) } } StaticMem.num = 12 // 初始化靜態(tài)變量 StaticMem.disp() // 調(diào)用靜態(tài)方法
編譯以上代碼,得到以下 JavaScript 代碼:
var StaticMem = /** @class */ (function () { function StaticMem() { } StaticMem.disp = function () { console.log("num 值為 " + StaticMem.num); }; return StaticMem; }()); StaticMem.num = 12; // 初始化靜態(tài)變量 StaticMem.disp(); // 調(diào)用靜態(tài)方法
輸出結(jié)果為:
num 值為 12
6. instanceof 運(yùn)算符
instanceof 運(yùn)算符用于判斷對(duì)象是否是指定的類(lèi)型,如果是返回 true,否則返回 false。
class Person{ } var obj = new Person() var isPerson = obj instanceof Person; console.log("obj 對(duì)象是 Person 類(lèi)范例化來(lái)的嗎? " + isPerson);
編譯以上代碼,得到以下 JavaScript 代碼:
var Person = /** @class */ (function () { function Person() { } return Person; }()); var obj = new Person(); var isPerson = obj instanceof Person; console.log(" obj 對(duì)象是 Person 類(lèi)范例化來(lái)的嗎? " + isPerson);
輸出結(jié)果為:
obj 對(duì)象是 Person 類(lèi)范例化來(lái)的嗎? true
7. 訪問(wèn)控制修飾符
TypeScript 中,可以使用訪問(wèn)控制符來(lái)保護(hù)對(duì)類(lèi)、變量、方法和構(gòu)造方法的訪問(wèn)。TypeScript 支持 3 種不同的訪問(wèn)權(quán)限。
-
public(默認(rèn)) : 公有,可以在任何地方被訪問(wèn)。
-
protected : 受保護(hù),可以被其自身以及其子類(lèi)和父類(lèi)訪問(wèn)。
-
private : 私有,只能被其定義所在的類(lèi)訪問(wèn)。
以下范例定義了兩個(gè)變量 str1 和 str2,str1 為 public,str2 為 private,范例化后可以訪問(wèn) str1,如果要訪問(wèn) str2 則會(huì)編譯錯(cuò)誤。
class Encapsulate { str1:string = "hello" private str2:string = "world" } var obj = new Encapsulate() console.log(obj.str1) // 可訪問(wèn) console.log(obj.str2) // 編譯錯(cuò)誤, str2 是私有的
8. 類(lèi)和接口
類(lèi)可以實(shí)現(xiàn)接口,使用關(guān)鍵字 implements,并將 interest 字段作為類(lèi)的屬性使用。
以下范例紅 AgriLoan 類(lèi)實(shí)現(xiàn)了 ILoan 接口:
interface ILoan { interest:number } class AgriLoan implements ILoan { interest:number rebate:number constructor(interest:number,rebate:number) { this.interest = interest this.rebate = rebate } } var obj = new AgriLoan(10,1) console.log("利潤(rùn)為 : "+obj.interest+",抽成為 : "+obj.rebate )
編譯以上代碼,得到以下 JavaScript 代碼:
var AgriLoan = /** @class */ (function () { function AgriLoan(interest, rebate) { this.interest = interest; this.rebate = rebate; } return AgriLoan; }()); var obj = new AgriLoan(10, 1); console.log("利潤(rùn)為 : " + obj.interest + ",抽成為 : " + obj.rebate);
輸出結(jié)果為:
利潤(rùn)為 : 10,抽成為 : 1
- JavaScript如何去掉末尾的分隔符
- 如何導(dǎo)入javaScript文件
- JavaScript如何對(duì)負(fù)數(shù)開(kāi)方
- javascript報(bào)錯(cuò)如何調(diào)試
- javascript中如何完成全選
- JavaScript農(nóng)陽(yáng)歷轉(zhuǎn)換的方法是什么
- javascript怎么實(shí)現(xiàn)登錄界面成功跳轉(zhuǎn)
- 如何用JavaScript在Vue3中實(shí)現(xiàn)動(dòng)畫(huà)
- vscode如何編寫(xiě)javascript
- JavaScript怎么自定義函數(shù)求累加
- javascript怎么設(shè)置三色燈
- javascript如何設(shè)置文本框
- TypeScript 教程
- TypeScript 基礎(chǔ)語(yǔ)法
- TypeScript Number
- TypeScript String 字符串
- TypeScript 元組
- TypeScript 接口
- TypeScript 類(lèi)
- TypeScript 模塊