面向對象
面向對象思維導圖
默認情況下,Javascript支持如下特性(紅色代表默認支持):
通過框架層面的支持,Javascript可以支持所有這些特性。
重點概念介紹
鴨子類型
如果一個東西(對象)看起來像鴨子(符合接口定義),走起路來也像鴨子(行為也符合期望),那么這個東西就是鴨子。
如所有動態語言一樣,Javascript天生就支持“鴨子類型”。從“多態”的維度考慮,Javascript是通過“鴨子類型”支持的“多態”。
代碼示例
1 var Rectangle = function (name) { 2 this.name = name; 3 }; 4 5 Rectangle.prototype.draw = function () { 6 console.log(this.name); 7 }; 8 9 var Circle = function (name) { 10 this.name = name; 11 }; 12 13 Circle.prototype.draw = function () { 14 console.log(this.name); 15 }; 16 17 var rectangle = new Rectangle('Rectangle'); 18 var circle = new Circle('Circle'); 19 var custom = { 20 name: 'Custom', 21 draw: function () { 22 console.log(this.name); 23 } 24 }; 25 26 var shapes = [rectangle, circle, custom]; 27 28 shapes[0].draw(); 29 shapes[1].draw(); 30 shapes[2].draw();
上例中三個對象不在一個繼承體系(先不考慮object),但是他們實現了多態。
鴨子類型的核心是”不關注其類型,只關注其職責“。
泛型
不同語言支持的泛型機制是不一樣的,這里不做深入了,我也很難給出一個定義。
Javascript天生就支持“泛型”。Javascript是通過“鴨子類型”支持的“泛型”的。
代碼示例
1 var Man = function () { 2 3 }; 4 Man.prototype.say = function () { 5 return 'Man'; 6 } 7 8 var Dog = function () { 9 10 }; 11 Dog.prototype.say = function () { 12 return 'Dog'; 13 } 14 15 var say = function (generic) { 16 console.log(generic.say()); 17 } 18 19 say(new Man()); 20 say(new Dog());
元編程
一種寫程序的程序。
如所有動態語言一樣,Javascript天生就支持“元編程”。
代碼示例
1 Function.prototype.accessor = function (name) { 2 this.prototype['get' + name] = function () { 3 return this.name; 4 }; 5 6 this.prototype['set' + name] = function (name) { 7 this.name = name; 8 } 9 }; 10 11 var User = function () { 12 13 }; 14 User.accessor('Name'); 15 16 var user = new User(); 17 user.setName('段光偉'); 18 console.log(user.getName());
原型繼承
Javascript:必須知道的Javascript知識點之“原型鏈”
Javascript:必須知道的Javascript知識點之“this指針”
隱式封裝
語言的作者一般會對人性有一個假設,一個常見的假設就是:
-
- 開發人員是愚蠢的,他們很容易犯錯誤,因此語言要防止他們犯錯誤。
- 開發人員是聰明的,他們會對自己的錯誤負責,因此語言要給予他們最大的靈活性。
Javascript選擇了第二種方式,因此它不在語言層面設置顯式的約束(private、protect),多數情況要根據團隊的約定。
備注
今天先理清了一些基本概念,關於單繼承、多繼承和摻入的介紹要等下一篇文章了。