编程模式,是源自经验和探索总结出的最佳实践方案,既有助于可读性和可维护性,也有助于提升整体性能。

行为隔离

总则:结构、样式和行为之间两两隔离。

  • 避免在结构中使用内联事件

  • 尽量少用 <script> 标签

  • 考虑 JavaScript 被禁用的情况,添加一些替换标签

命名空间

为了减少命名冲突,优化 JavaScript 性能,尽量只定义几个全局变量,并将其他变量和方法定义为这几个变量的属性。

//定义全局变量
var MYAPP = window.MYAPP || {};
//定义属性
MYAPP.event = {};
//定义方法
MYAPP.event = {
addListener : function() {
//执行相关的逻辑操作
}
removeListener : function() {
//执行相关的逻辑操作
}
//其他方法
};

在命名空间中使用构造器函数。

MYAPP.dom = {};
MYAPP.dom.Element = function (type, prop) {
var tep = document.createElement(type);
for (var i in prop) {
tmp.setAttribute(i, prop[i]);
}
return tmp;
}

命名空间方法:

var MYAPP = window.MYAPP || {};
MYAPP.namespace = function (name) {
var parts = name.split(“.”);
var current = MYAPP;
for (var i in parts) {
if (!current[parts[i]]) {
current[parts[i]] = {};
}
current = current[parts[i]];
}
}
MYAPP.namespace(“dom.event”);
// 上述操作等价于:
var MYAPP = {
dom: {
event: {}
}
}

初始化功能

由于浏览器的不一致性,当我们使用 JavaScript 操作 DOM 或 BOM 前,通常会进行一定的功能检测。如果在运行前需要检测的功能较多,那么就会严重影响脚本的执行速度。对于这个问题,可以通过初始化功能解决,即在脚本加载后,立即对重要的函数执行功能检测。如此,后续就无需检测功能,可以直接执行相关的函数。

var MYAPP = window.MYAPP || {};
MYAPP.event = {
addListener: null,
removeListener: null
};
// 初始化功能演示如下:
if (typeof window.addEventListener === ‘function’) {
MYAPP.event.addListener = function (el, type, fn) {
el.addEventListener(type, fn, false);
};
MYAPP.event.removeListener = function (el, type, fn) {
el.removeEventListener(type, fn, false);
};
} else if (typeof document.attachEvent === “function”) {
MYAPP.event.addListener = function (el, type, fn) {
el.attachEvent(“on” + type, fn);
};
MYAPP.event.removeListener = function (el, type, fn) {
el.detachEvent(“on” + type, fn);
};
} else {
MYAPP.event.addListener = function (el, type, fn) {
el[“on” + type] = fn;
};
MYAPP.event.removeListener = function (el, type, fn) {
el[“on” + type] = null;
};
}

延迟定义

延迟定义,恰巧与初始化模式的思想相反。对于那些不一定会被调用的函数,可以让其被调用时再初始化,并且只进行一次初始化。

var MYAPP = window.MYAPP || {};
MYAPP.event = {
addListener: function(el, type, fn) {
if (typeof window.addEventListener === ‘function’) {
MYAPP.event.addListener = function (el, type, fn) {
el.addEventListener(type, fn, false);
};
} else if (typeof document.attachEvent === “function”) {
MYAPP.event.addListener = function (el, type, fn) {
el.attachEvent(“on” + type, fn);
};
} else {
MYAPP.event.addListener = function (el, type, fn) {
el[“on” + type] = fn;
};
}
MYAPP.event.addListener(el, type, fn);
}
};

这个地方我需要修改一下,使用可以重写自己的函数。

配置对象

配置对象模式,适用于向函数中传递多个参数。简单的说,就是将参数集合放入一个对象中,将对象传给参数,这个对象甚至可以是一个 JSON 文件。当参数量较少时,就像是传统的传参,当参数集庞大时,就如同传递环境配置变量。将变量和函数解耦,是非常不错的实践:

  • 无需考虑参数的顺序

  • 可以忽略某些参数

  • 具有更好的可读性和可维护性

var MYAPP = window.MYAPP || {};
MYAPP.dom = {};
MYAPP.dom.Button = function(text, conf) {
var type = conf.type || “submit”;
var color = conf.color || “red”
}
// 使用方式
var conf = {
type: “reset”,
color: “green”
};
new MYAPP.dom.Button(“Reset”, conf);

私有变量和方法

与 C++、JAVA 不同,JavaScript 中并没有控制访问权限的修饰符,但我们可以使用局部变量和函数来实现类似的权限控制。

var MYAPP = window.MYAPP || {};
MYAPP.dom = {};
MYAPP.dom.Button = function (text, conf) {
var styles = {
color: “black”
}
function setStyles() {
for (var i in styles) {
b.style[i] = conf[i] || styles[i];
}
}
conf = conf || {};
var b = document.createElement(“input”);
b.type = conf[“type”] || “submit”;
b.value = text;
setStyles();
return b;
}

在这里,styles 是一个私有属性,而 setStyle() 则是一个私有方法。构造器可以在内部调用它们(它们也可以访问构造器中的任何对象),但它们不能被外部代码所调用。

特权函数

在上例中,我们可以为 b 添加一个 getDefaults() 方法,返回 styles 对象,从而实现对内部属性或方法的访问,这个 getDefaults() 就是一种特权函数。

私有函数的公有化

为了防止外部修改,将函数设为私有,有时候又想外部可以访问到,所以有需要设为公有。解决方案是,使用公有变量引用私有函数,即可将其公有化。

var MYAPP = window.MYAPP || {};
MYAPP.dom = {};
MYAPP.dom.Button = (function () {
var _setStyle = {};
var _getStyle = ();
return {
setStyle: _setStyle,
getStyle: _getStyle,
yetAnother: _setStyle
};
})();

自执行的函数

使用立即执行的匿名函数,同样可以保证全局命名空间不会受到污染。这种函数的所有变量都是局部的,并在函数返回时被销毁(非闭包)。

适合于执行一次性的初始化任务。

(function(){
//编写逻辑操作代码
})()

链式调用

链式调用,是一种便捷的调用方式。其实现本质是使用一致的上下文对象,并在链式方法间传递这个对象。这种灵活的调用方式也是 jQuery 的一大特色。

JSON

JSON 是一种轻量级的数据交换格式。由于它本身就是由类似 JavaScript 的对象和数组标记的数据构成的,所以解析起来非常方便。

说道解析,我们可以使用 JavaScript 的 eval() 方法转换;但是由于 eval() 本身的缺陷,这件事还是使用更安全的方法吧,比如 JavaScript 的某些库(http://json.org):

var obj = JSON.parse(xhr.respnseText);

JavaScript 编程模式的更多相关文章

  1. Javascript编程模式(JavaScript Programming Patterns)Part 1.(初级篇)

    JavaScript 为网站添加状态,这些状态可能是校验或者更复杂的行为像拖拽终止功能或者是异步的请求webserver (aka Ajax). 在过去的那些年里, JavaScript librar ...

  2. Javascript编程模式(JavaScript Programming Patterns)Part 2.(高级篇)

    模块编程模式的启示(Revealing Module Pattern) 客户端对象(Custom Objects) 懒函数定义(Lazy Function Definition) Christian  ...

  3. javascript常见编程模式举例

    近期买到手了一本<javascript框架设计>,具体介绍开发js框架所用到的知识.初读一点,乐帝脆弱的理论修养就暴露无遗了,所以专门加强理论修养,重看javascript编程模式的举例. ...

  4. javascript编程单线程之同步模式

    javascript编程单线程之同步模式 主流的js 环境都是单线程吗模式执行js 代码, js采用为单线程的原因与最开始设计初衷有关,最早是运行在浏览器端的脚本语言,目的是为了实现页面上的动态交互, ...

  5. Javascript原型模式总结梳理

    在大多数面向对象语言中,对象总是由类中实例化而来,类和对象的关系就像模具跟模件一样.Javascript中没有类的概念,就算ES6中引入的class也不过是一种语法糖,本质上还是利用原型实现.在原型编 ...

  6. javascript编程的最佳实践推荐

    推荐的javascript编程的最佳实践,摘要记录在这里: 可维护的代码保证代码的性能部署代码 1 可维护的代码1.1什么是维护的代码:可理解性——其他人可以接手代码并理解它的意图和一般途径,而无需原 ...

  7. JQuery日记6.5 Javascript异步模式(一)

    理解力JQuery前实现异步队列,有必要理解javascript异步模式. Javascript异步其实并不严重格异步感,js使某些片段异步方式在将来运行,流不必等待继续向下进行. 在多线程的语言中最 ...

  8. 【HANA系列】SAP HANA XS使用JavaScript编程详解

    公众号:SAP Technical 本文作者:matinal 原文出处:http://www.cnblogs.com/SAPmatinal/ 原文链接:[HANA系列]SAP HANA XS使用Jav ...

  9. 学习现代 JavaScript 编程的最佳教程

    天天编码 , 版权所有丨本文标题:0.0 学习现代 JavaScript 编程的最佳教程 转载请保留页面地址:http://www.tiantianbianma.com/the-modern-java ...

随机推荐

  1. 任务04——对四则运算小程序的进一步改进,并学习 Git 中 Branch 的用法

    https://github.com/jinxiaohang/Operation/tree/test01 对于任务2的代码进行优化修改感觉很麻烦,所以直接选择重写代码完成任务四, 任务四很早就发布了, ...

  2. Eclipse中svn操作

    1.主干和分支间合并代码 合并根据目标不同分为2种: 1.分支合并到主干:主要用在修复完生产BUG,并上线之后.需把改动的代码合并到主干上. 2.主干合并到分支:公用的逻辑改动,需反映到所有并行的分支 ...

  3. Mybatis使用pageHelper步骤

    1.在pom.xml中添加如下依赖: <dependency> <groupId>com.github.pagehelper</groupId> <artif ...

  4. func && operation_yes || operation_no (Shell)

    通过&&, || 理解shell中的函数返回值. 我想实现如下功能: 写一个函数判断一个字符串中是否只包含数字,并返回相应的标志(是/否); 通过调用上面的函数,判断给定的字符串是否只 ...

  5. ubuntu搭建mib2c环境

    1.下载net-snmphttp://net-snmp.sourceforge.net/download.html例如,下载5.5版本2.进入下载目录,解压net-snmp压缩包#tar zxf ne ...

  6. form 表单<input type="button" value="登录" onclick="loginSubmit ()"/> 点击提示 Uncaught TypeError: loginSubmit is not a function

    在网上搜了一堆东东,仔细看了一下,再加上实验,发现原因出在<form>中. <form method="post"> <button type=&qu ...

  7. iframe 跨域请求

    iframe.contentWindow 兼容各个浏览器,可取得子窗口的 window 对象. iframe.contentDocument Firefox 支持,> ie8 的ie支持.可取得 ...

  8. 20145240 《Java程序设计》第四次实验报告

    20145240 <Java程序设计>第四次实验报告 北京电子科技学院(BESTI)实验报告 课程:Java程序设计 班级:1452 指导教师:娄嘉鹏 实验日期:2016.04.26 实验 ...

  9. MySQL备份账号权限

    grant select,show view,lock tables,trigger on confluence.* to 'DBbackup'@'127.0.0.1' identified by ' ...

  10. ubuntu+vm+ftp

    为了将windows下的文件传到linux中去,使用FZ来做服务器,在linux中进入ftp状态获取. 1.下载FileZilla服务器,在windows下安装就行了(试过汉化插件,用了就报错,所以还 ...