在JavaScript中定義類的最佳方法是不定義類。
我是認(rèn)真的。
面向?qū)ο笥袔追N不同的風(fēng)格,其中一些是:
- 基于類的OO(第一次由Smalltalk引入)
- 基于原型的OO(首先由Self引入)
- 基于多方法的OO(我認(rèn)為首次由CommonLoops引入)
- 基于謂詞的OO(不知道)
也許還有一些我不知道的人。
JavaScript實現(xiàn)了基于原型的OO。在基于原型的OO中,新對象是通過復(fù)制其他對象(而不是從類模板中實例化)創(chuàng)建的,方法直接存在于對象中而不是類中。繼承是通過委托完成的:如果對象沒有方法或?qū)傩裕瑒t會在其原型(即從其克隆的對象)上查找該對象,然后再查找原型的原型,以此類推。
換句話說:沒有課。
JavaScript實際上對該模型進(jìn)行了很好的調(diào)整:構(gòu)造函數(shù)。也就是說,你不僅可以通過復(fù)制現(xiàn)有的物體來創(chuàng)建對象,還可以通過“稀薄的空氣”來構(gòu)造它們。如果使用new
關(guān)鍵字,則該函數(shù)將成為構(gòu)造函數(shù),而this
關(guān)鍵字不會指向當(dāng)前對象,而是指向新創(chuàng)建的“空”對象。因此,您可以任意配置對象。這樣,JavaScript構(gòu)造函數(shù)就可以在傳統(tǒng)的基于類的OO中扮演類的角色:充當(dāng)新對象的模板或藍(lán)圖。
現(xiàn)在,JavaScript是一種非常強大的語言,因此實現(xiàn)一個基于類的面向?qū)ο笙到y(tǒng)非常容易。在JavaScript中如果你想的話。但是,只有當(dāng)您確實需要它時才應(yīng)該這樣做,而不僅僅是因為Java就是這樣做的。