• 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),多数情况要根据团队的约定。

    备注

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

  • 相关阅读:
    [原创]快速排序(C++版)
    连接mysql8.0时报错的问题
    关于idea无法使用搜狗输入法打出汉字的解决方案(转)
    bootStrap select组件相关问题
    idea 项目可以运行但是jsp中url报红的问题
    idea 项目启动找不到页面问题和run/debug只能启动一个的问题
    form序列化到后台中文乱码
    在js中获取bootStrap table 的属性
    三元运算符,多条件时判断
    Spring获取日期时间差8小时问题解决
  • 原文地址:https://www.cnblogs.com/happyframework/p/3051635.html
Copyright © 2020-2023  润新知