在javascript中,我們實際上沒有類,但只有普通對象*(「哈希表」-y)具有原型功能。函數是某種對象(在它上面有一點糖語法)。
*(非學術正確地說,和隱藏一些東西)
試試下面的例子瀏覽器的調試器內,做一些檢查
var parent = {
method1: function() { return 1 } ,
method2: function() { return 2 }
}
var child = Object.create(parent)
child.method2 = function() { return '2a' }
child.__proto__ //shows parent
parent.__proto__ //shows Object (the "root class")
child.method3() //undefined is not a function
child.method2() //2a, not 2
child.method1() //method1 not found, looks at __proto__, returns 1
child.toString
//looks at child, not found
//looks at child.__proto__ (parent), not found
//looks at child.__proto__.__proto__ (Object), returns function
一下班(從ES2015和transpilers)大致做的是從對象和原型開始,爲了從其他語言獲得class
行爲/編程風格,您需要編寫一些膠水代碼。
在ES2015中,類聲明創建一個「原型」對象,new
(或Object.create **)創建一個繼承該原型的「實例」對象。
現在回到打字稿...
var a : { b : string }
a.b = '4'
{ b : string }
只是一個註解。它進入了類型的領域。假設在打字稿中,我們有2個領域,即具體變量的領域,這些領域結束於生成的代碼中;和類型的領域,這些領域完全用於援助/短缺,但不會落在真正的JS中。 { b : string }
可使用任一interface
或type
語法
type Ta = { b : string } //or
interface Ta { b : string }
var a : Ta
聲明類型的註釋(包括接口)添加零碼到混凝土JS境界被引用了。
..on另一方面,當您使用class
,打字稿既創造
- 具體JS代碼(即原型對象)
- 也是一對夫婦類型的境界居民。
TL; DR:
我們答案,有任何的2種方式沒有什麼大問題,但使用接口(和更少班)向最常見的JavaScript編碼風格傾斜。有些JS學校主張反對課程的使用,因爲你可以通過其他模式獲得相同的效果。
你爲什麼在第一個例子中投射?這是不必要的 –
這的確是這樣,但問題仍然有效;-) – ssougnez
如果你只是想擁有一個帶有屬性的對象,那麼去接口的第一個選項,但如果你想擁有該對象的方法,那麼去一個類 –