第一章 面向对象的JavaScript

  1. 动态类型语言和鸭子类型

    • 编程语言按照数据类型大体可以分为两类:静态类型语言、动态类型语言。
    • 静态类型语言:在编译时便已确定变量的类型。
      • 优点:

        1. 在编译时就能发现类型不匹配的错误。
        2. 在程序中明确地规定了数据类型,编译器还可以针对这些信息对程序进行一些优化工作,提高程序执行速度。
      • 缺点:类型的声明也会增加更多的代码,会让程序员的精力从思考业务逻辑上分散开来。
    • 动态类型语言:变量类型要到程序运行的时候,待变量被赋予某个值之后,才会具有某种类型。
      • 优点:

        1. 编写的代码数量更少,看起来也更加简洁,程序员可以把精力更多地放在业务逻辑上面。
        2. 编码灵活。
      • 缺点:无法保证变量的类型,从而在程序的运行期有可能发生跟类型相关的错误。
    • JavaScript是一门典型的动态类型语言。
    • 鸭子类型:如果它走起路来像鸭子,叫起来也是鸭子,那么它就是鸭子。
  2. 多态:同一操作作用于不同的对象上面,可以产生不同的解释和不同的执行结果。

    • 多态JavaScript例子:
    1. var makeSound = function (animal) {
    2. if (animal instanceof Duck) {
    3. console.log('嘎嘎嘎');
    4. } else if (animal instanceof Chicken) {
    5. console.log('咯咯咯');
    6. }
    7. };
    8. var Duck = function () {};
    9. var Chicken = function () {};
    10. makeSound(new Duck()); // 嘎嘎嘎
    11. makeSound(new Chicken()); // 咯咯咯
    • 对象的多态性:
    1. var makeSound = function (animal) {
    2. animal.sound();
    3. };
    4. var Duck = function () {}
    5. Duck.prototype.sound = function () {
    6. console.log('嘎嘎嘎');
    7. };
    8. var Chicken = function () {}
    9. Chicken.prototype.sound = function () {
    10. console.log('咯咯咯');
    11. };
    12. makeSound(new Duck()); // 嘎嘎嘎
    13. makeSound(new Chicken()); // 咯咯咯
    • 类型检查和多态:在静态类型语言中编译时会进行类型匹配检查,不能给变量赋予不同类型的值所以需要向上转型(当给一个类变量赋值时,这个变量的类型既可以使用这个类本身,也可以使用这个类的超类)。
    • 使用继承得到多态效果
      • 继承通常包括实现继承和接口继承。
      • 实现继承例子:

        先创建一个Animal 抽象类,再分别让Duck 和Chicken 都继承自Animal 抽象类
      1. public abstract class Animal {
      2. abstract void makeSound(); // 抽象方法
      3. }
      4. public class Chicken extends Animal {
      5. public void makeSound() {
      6. System.out.println("咯咯咯");
      7. }
      8. }
      9. public class Duck extends Animal {
      10. public void makeSound() {
      11. System.out.println("嘎嘎嘎");
      12. }
      13. }
      14. Animal duck = new Duck(); // (1)
      15. Animal chicken = new Chicken(); // (2)
      16. public class AnimalSound {
      17. public void makeSound(Animal animal) { // 接受Animal 类型的参数
      18. animal.makeSound();
      19. }
      20. }
      21. public class Test {
      22. public static void main(String args[]) {
      23. AnimalSound animalSound = new AnimalSound();
      24. Animal duck = new Duck();
      25. Animal chicken = new Chicken();
      26. animalSound.makeSound(duck); // 输出嘎嘎嘎
      27. animalSound.makeSound(chicken); // 输出咯咯咯
      28. }
      29. }
    • JavaScript的多态
      • 多态的思想实际上是把“做什么”和“谁去做”分离开来。
      • 在JavaScript 中,并不需要诸如向上转型之类的技术来取得多态的效果。
    • 多态在面向对象程序设计中的作用
      • 《重构:改善既有代码的设计》里写到:多态的最根本好处在于,你不必再向对象询问“你是什么类型”而后根据得到的答案调用对象的某个行为——你只管调用该行为就是了,其他的一切多态机制都会为你安排妥当。
      • 多态最根本的作用就是通过把过程化的条件分支语句转化为对象的多态性,从而消除这些条件分支语句。
      • 地图应用例子:
      1. var googleMap = {
      2. show: function () {
      3. console.log('开始渲染谷歌地图');
      4. }
      5. };
      6. var baiduMap = {
      7. show: function () {
      8. console.log('开始渲染百度地图');
      9. }
      10. };
      11. var renderMap = function (map) {
      12. if (map.show instanceof Function) {
      13. map.show();
      14. }
      15. };
      16. renderMap('google'); // 输出:开始渲染谷歌地图
      17. renderMap('baidu'); // 输出:开始渲染百度地图
    • 封装:封装的目的是将信息隐藏
      • 封装数据:JavaScript 并没有提供对这些关键字的支持,我们只能依赖变量的作用域来实现封装特性,而且只能模拟出public 和private 这两种封装性。例子:
      1. var myObject = (function () {
      2. var __name = 'sven'; // 私有(private)变量
      3. return {
      4. getName: function () { // 公开(public)方法
      5. return __name;
      6. }
      7. }
      8. })();
      9. console.log(myObject.getName()); // 输出:sven
      10. console.log(myObject.__name) // 输出:undefined
      • 封装类型:封装类型是通过抽象类和接口来进行的。把对象的真正类型隐藏在抽象类或者接口之后,JavaScript 中,并没有对抽象类和接口的支持。
      • 封装变化:封装在更重要的层面体现为封装变化,《设计模式》一书曾提到如下文字,“考虑你的设计中哪些地方可能变化,这种方式与关注会导致重新设计的原因相反。它不是考虑什么时候会迫使你的设计改变,而是考虑你怎样才能够在不重新设计的情况下进行改变。这里的关键在于封装发生变化的概念,这是许多设计模式的主题。”
    • 原型模式和基于原型继承的JavaScript对象系统:JavaScript 也同样遵守这些原型编程的基本规则
      • 所有的数据都是对象

        1. 基本类型包括undefined、number、boolean、string、function、object。
        2. JavaScript 中的根对象是Object.prototype 对象,Object.prototype 对象是一个空的对象。
      • 要得到一个对象,不是通过实例化类,而是找到一个对象作为原型并克隆它。

《JavaScript设计模式与开发实践》笔记第一章的更多相关文章

  1. 《Javascript设计模式与开发实践》--读书笔记

    第2章 this call apply bind()方法创建一个新的函数,在bind()被调用时,这个新函数的this被bind的第一个参数指定,其余的参数将作为新函数的参数供调用时使用. bind( ...

  2. 《JavaScript设计模式与开发实践》读书笔记-基础知识

    笔记内容多摘录自<JavaScript设计模式与开发实践>(曾探著),侵删. 面向对象的JavaScript 1. 动态需要类型和鸭子类型 鸭子类型 如果它走起路来像鸭子,叫起来也是鸭子, ...

  3. JavaScript设计模式与开发实践——读书笔记1.高阶函数(上)

    说来惭愧,4个多月未更新了.4月份以后就开始忙起来了,论文.毕设.毕业旅行等七七八八的事情占据了很多时间,毕业之后开始忙碌的工作,这期间一直想写博客,但是一直没能静下心写.这段时间在看<Java ...

  4. JavaScript设计模式与开发实践 - 观察者模式

    概述 观察者模式又叫发布 - 订阅模式(Publish/Subscribe),它定义了一种一对多的关系,让多个观察者对象同时监听某一个目标对象(为了方便理解,以下将观察者对象叫做订阅者,将目标对象叫做 ...

  5. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  6. JavaScript设计模式与开发实践 - 策略模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在现实中,很多时候也有多种途径到达同一个目的地.比如我们要去某个地方旅游,可以根据具体的实际情况来选择出行的线路. 如果没有时间但 ...

  7. 《javascript设计模式与开发实践》--- (单一职责原则)

    看的这本书叫<JavaScript设计模式与开发实践> 先规划一下看书的顺序,基础知识我已经大概的浏览了一遍了,没有留下笔记,以后有时间还会补上.本来打算顺着看的.但是我感觉我很难短时间内 ...

  8. JavaScript设计模式与开发实践 - 单例模式

    引言 本文摘自<JavaScript设计模式与开发实践> 在传统开发工程师眼里,单例就是保证一个类只有一个实例,实现的方法一般是先判断实例存在与否,如果存在直接返回,如果不存在就创建了再返 ...

  9. Javascript设计模式与开发实践读书笔记(1-3章)

    第一章 面向对象的Javascript 1.1 多态在面向对象设计中的应用   多态最根本好处在于,你不必询问对象“你是什么类型”而后根据得到的答案调用对象的某个行为--你只管调用行为就好,剩下的一切 ...

随机推荐

  1. Kali Linux 渗透测试手册(1.1)安装虚拟机

    翻译来自:掣雷小组 成员信息: thr0cyte, Gr33k, 花花, 小丑, R1ght0us, 7089bAt, 一.配置KALI Linux和渗透测试环境 在这一章,我们将覆盖以下内容: 在W ...

  2. Android开发:Eclipse+OpenCV环境搭建

    一.OpenCV预备: OpenCV是一个跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它由一系列 C 函数和少量 C++ 类构成,同时提供了Pyt ...

  3. golang中Context的使用场景

    golang中Context的使用场景 context在Go1.7之后就进入标准库中了.它主要的用处如果用一句话来说,是在于控制goroutine的生命周期.当一个计算任务被goroutine承接了之 ...

  4. 【Python3爬虫】自动查询天气并实现语音播报

    一.写在前面 之前写过一篇用Python发送天气预报邮件的博客,但是因为要手动输入城市名称,还要打开邮箱才能知道天气情况,这也太麻烦了.于是乎,有了这一篇博客,这次我要做的就是用Python获取本机I ...

  5. WebApiClient的接口输入验证

    1. 文章目的 随着WebApiClient的不断完善,越来越多开发者选择WebApiClient替换原生的HttpClient,本文将介绍WebApiClient的接口参数输入有效性验证的新特性. ...

  6. HTTP1.0和HTTP1.1的区别

    1.HTTP 1.1支持长连接(PersistentConnection)和请求的流水线(Pipelining)处理 HTTP 1.0规定浏览器与服务器只保持短暂的连接,浏览器的每次请求都需要与服务器 ...

  7. Keras入门(四)之利用CNN模型轻松破解网站验证码

    项目简介   在之前的文章keras入门(三)搭建CNN模型破解网站验证码中,笔者介绍介绍了如何用Keras来搭建CNN模型来破解网站的验证码,其中验证码含有字母和数字.   让我们一起回顾一下那篇文 ...

  8. Centos7 Jenkins日志过大

    df 查看 占用 [root@instance-ncwnnt0e /]# df Filesystem 1K-blocks Used Available Use% Mounted on devtmpfs ...

  9. Convert.ToInt32()和int.Parse()区别

    Convert.ToInt32()和int.Parse()都可以数据转换个int类型,区别在于: 1. Convert.ToInt32()将object类类型转换成int类型,例如:Convert.T ...

  10. Spring(三)使用JdbcTemplate对象完成查询

    查询银行账户的数量 1.建立一个项目导入jar包(ioc aop dao 连接池 数据库驱动 ),拷贝容器对应的配置文件到src下 2.在配置文件中开启组件扫描 3.写一个DAO接口定义一个查询方法 ...