Javascript:用 "脑图软件" 学习 “面向对象”
面向对象
面向对象思维导图
默认情况下,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),多数情况要根据团队的约定。
备注
今天先理清了一些基本概念,关于单继承、多继承和掺入的介绍要等下一篇文章了。