類
類的關鍵字 clss可以聲名乙個類,類可以從字面上理解,類裡面有很多態別的資料或者方法,類可以被子類或者介面繼承。
class
greeter
greet()
}let greeter =
newgreeter
("world"
);
上面是乙個類的使用,可見類裡面可以囊括多種資料介面。我們一般這樣說:這個類有3個成員:乙個叫做 greeting的屬性,乙個建構函式和乙個 greet方法。
我們在引用任何乙個類成員的時候都用了 this, 它表示我們訪問的是類的成員。
繼承
繼承的關鍵字extends可以繼承乙個類,繼承是幹什麼的?直白一點就是拿走那些資料夫類的非私有的東西。
看下面的例子:
class
animal
move
(distanceinmeters:
number=0
)moved
$m.`);
}}class
snake
extends
animal
move
(distanceinmeters =5)
}class
horse
extends
animal
move
(distanceinmeters =45)
}let sam =
newsnake
("sammy the python");
let tom: animal =
newhorse
("tommy the palomino");
sam.
move()
;//slithering... sammy the python moved 5m
tom.
move(34
);//galloping... tommy the palomino moved 34m
規定:子類在constructor中必須使用super關鍵字,這個super代表著對父類的呼叫。
公共,私有與受保護的修飾符
class
animal
public
move
(distanceinmeters:
number
)moved
$m.`);
}}
類裡面public關鍵字是定義此方法或者屬性是公共的,可被子類繼承的。
public很好理解當什麼都不聲名時,預設是public
private
當成員被標記成 private時,它就不能在宣告它的類的外部訪問。比如:
class
animal
}new
animal
("cat"
).name;
// 錯誤: 'name' 是私有的.
typescript使用的是結構性型別系統。 當我們比較兩種不同的型別時,並不在乎它們從何處而來,如果所有成員的型別都是相容的,我們就認為它們的型別是相容的。
然而,當我們比較帶有 private或 protected成員的型別的時候,情況就不同了。 如果其中乙個型別裡包含乙個 private成員,那麼只有當另外乙個型別中也存在這樣乙個 private成員, 並且它們都是來自同一處宣告時,我們才認為這兩個型別是相容的。 對於 protected成員也使用這個規則。
我們要怎麼樣理解這段話?看例子
class
animal
}class
rhino
extends
animal
}class
employee
}let animal =
newanimal
("goat");
let rhino =
newrhino()
;let employee =
newemployee
("bob");
animal = rhino;
animal = employee;
// 錯誤: animal 與 employee 不相容.
也就是說animal類和employee 不相容,父類裡面的私有屬性不可以在子類中訪問但可以在super中傳遞。
protected
protected修飾符與 private修飾符的行為很相似,但有一點不同, protected成員在派生類中仍然可以訪問。例如:
class
person
}class
employee
extends
person
public
getelevatorpitch()
and i work in $.`
;}}let howard =
newemployee
("howard"
,"sales");
console
.log
(howard.
getelevatorpitch()
);console
.log
(howard.name)
;// 錯誤
靜態屬性
到目前為止,我們只討論了類的例項成員,那些僅當類被例項化的時候才會被初始化的屬性。 我們也可以建立類的靜態成員,這些屬性存在於類本身上面而不是類的例項上。 在這個例子裡,我們使用 static定義 origin,因為它是所有網格都會用到的屬性。 每個例項想要訪問這個屬性的時候,都要在 origin前面加上類名。 如同在例項屬性上使用 this.字首來訪問屬性一樣,這裡我們使用 grid.來訪問靜態屬性。
class
grid
;calculatedistancefromorigin
(point:
)constructor
(public scale:
number)}
let grid1 =
newgrid
(1.0);
// 1x scale
let grid2 =
newgrid
(5.0);
// 5x scale
console
.log
(grid1.
calculatedistancefromorigin()
);console
.log
(grid2.
calculatedistancefromorigin()
);
換成漢語說就是靜態屬性直接通過類名加.的形式訪問,而且靜態屬性屬於類本身,無需例項化。
抽象類
看到抽象這個詞先不要慌,因為抽象其實並不是你理解的那麼抽象
抽象類做為其它派生類的基類使用。 它們一般不會直接被例項化。 不同於介面,抽象類可以包含成員的實現細節。 abstract關鍵字是用於定義抽象類和在抽象類內部定義抽象方法。
abstract
class
animal
}
抽象類中的抽象方法不包含具體實現並且必須在派生類中實現。 抽象方法的語法與介面方法相似。 兩者都是定義方法簽名但不包含方法體。 然而,抽象方法必須包含 abstract關鍵字並且可以包含訪問修飾符。
abstract
class
department
printname()
:void
abstract
printmeeting()
:void
;// 必須在派生類中實現
}class
accountingdepartment
extends
department
printmeeting()
:void
generatereports()
:void
}let department: department;
// 允許建立乙個對抽象型別的引用
department =
newdepartment()
;// 錯誤: 不能建立乙個抽象類的例項
department =
newaccountingdepartment()
;// 允許對乙個抽象子類進行例項化和賦值
department.
printname()
;department.
printmeeting()
;department.
generatereports()
;// 錯誤: 方法在宣告的抽象類中不存在
Typescript學習記錄 回顧ES5繼承
b類繼承a類的方法 function a name run a.prototype.age 21 a.prototype.coding function coding var a newa aaa a.run a.coding es5的繼承,b繼承a function b name 繼承a原型鏈的拷...
類與物件的初探
物件 object 類是具有相似內部狀態和運動規律的實體的集合 或統稱 抽象 例 string 就是乙個物件 類 calss 描述了一組有相同特性 屬性 和相同行為 方法 的物件。特性 1 抽象 類的定義中明確指出類是一組具有內部狀態和運動規律物件的抽象,抽象是一種從一般的觀點看待事物的方法,它要求...
TypeScript學習筆記3 類與介面
介面 inte ces 可以用於對 物件的形狀 shape 進行描述。implements 實現 implements 是物件導向中的乙個重要概念。類實現介面 乙個類只能繼承自另乙個類,有時候不同類之間可以有一些共有的特性,這時候就可以把特性提取成介面 inte ces 用 implements 關...