JavaScript设计模式(一)

使用JavaScript框架和库过程中, 我遇到过很多感觉上'奇形怪状'的代码. 大多数情况下, 按照惯例编写代码也能够写出很多出色的功能. 但是如果不从根本上理解它们实现的方法, 就没办法完全充分发挥出它们的全部优点.

以下是我阅读 JavaScript设计模式(Ross Harmes和Dustin Diaz合著) 后的理解:

Getting Started

JavaScript是一门非常灵活的语言, 完成同一个任务的编程模式可能有很多种. 例如, 我想要编写一个启动/停止的动画:

  1. 普通的过程式编程

    function startAnimation() {...};
    function stopAnimation() {...};
  2. 通过定义一个类

    var Anim = function() {...};
    
    //把两个方法定义在原型对象中
    Anim.prototype.start = function() {...};
    Anim.prototype.stop = function() {...};
    
    var myAnim = new Anim();
    myAnim.start();
    myAnim.stop();

    或者, 用字面量对象创建类

    var Anim = function() {...};
    
    Anim.prototype = {
        start: function() {...},
        stop: function() {...},
    };

    tips: 虽然这两种方法看起来很类似, 实质上有不小的差异.

    造成差异的原因是, 每个构造函数的prototype属性默认指向一个原型对象. 原型对象包含一个constructor属性, 这个属性指向它的构造函数.

    而字面量式相当于手动创建了一个新的对象, 然后把新对象赋值给了prototype属性. 由于这个新对象是人为定义的, 也没有手动给它定义constructor属性. 所以造成了第二种方式的原型对象的constructor属性没有指向它的构造函数, 而指向了Object, 这显然不是我们想要的.

  3. 更加'面向对象'的方式

    //在JavaScript中你可以很轻易地
    //在原生的Function类中定义一个辅助函数
    Function.prototype.method = function(name, fn) {
        this.prototype[name] = fn;
    };
    
    var Anim = function() {...};
    Anim.method( 'start', function() {...} );
    Anim.method( 'stop', function() {...} );

    简略修改一下以上的代码, 你甚至可以链式调用方法! (在jQuery中被大量应用的技巧)

    只需要在辅助函数中返回 this:

    Function.prototype.method = function(name, fn) {
        this.prototype[name] = fn;
        return this;
    };
    
    var Anim = function() {...};
    Anim.method( 'start', function() {...} )
        .method( 'stop', function() {...} );    

转载于:https://www.cnblogs.com/lozio/p/4471425.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第1章 简介   模式   JavaScript:基本概念   ECMAScript 5   JSLint   Console   第2章 基本技巧   编写可维护的代码   尽量少用全局变量   for循环   for-in循环   不要增加内置的原型   SWitch模式   避免使用隐式类型转换   使用parseInt()的数值约定   编码约定   命名约定   编写注释   编写API文档   编写可读性强的代码   同行互查   在正式发布时精简代码   运行JSLint   小结   第3章 字面量和构造函数   对象字面量   自定义构造函数   强制使用new的模式   数组字面量   JSON   正则表达式字面量   基本值类型包装器   错误对象   小结   第4章 函数   背景   回调模式   返回函数   自定义函数   即时函数   即时对象初始化   初始化时分支   函数属性——备忘模式   配置对象   Curry   小结   第5章 对象创建模式   命名空间模式   声明依赖关系   私有属性和方法   模块模式   沙箱模式   静态成员   对象常量   链模式   method()方法   小结   第6章 代码复用模式   传统与现代继承模式的比较   使用类式继承时的预期结果   类式继承模式#1——默认模式   类式继承模式#2——借用构造函数   类式继承模式#3——借用和设置原型   类式继承模式#4——共享原型   类式继承模式#5——临时构造函数   Klass   原型继承   通过复制属性实现继承   借用方法   小结   第7章 设计模式   单体模式   工厂模式   迭代器模式   装饰者模式   策略模式   外观模式   代理模式   中介者模式   观察者模式   小结   第8章 DOM和浏览器模式   关注分离   DOM脚本   事件   长期运行脚本   远程脚本   配置JavaScript   载入策略

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值