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指针”

隐式封装

语言的作者一般会对人性有一个假设,一个常见的假设就是:

    1. 开发人员是愚蠢的,他们很容易犯错误,因此语言要防止他们犯错误。
    2. 开发人员是聪明的,他们会对自己的错误负责,因此语言要给予他们最大的灵活性。

Javascript选择了第二种方式,因此它不在语言层面设置显式的约束(private、protect),多数情况要根据团队的约定。

备注

今天先理清了一些基本概念,关于单继承、多继承和掺入的介绍要等下一篇文章了。

原文地址:https://www.cnblogs.com/happyframework/p/3051635.html