闲话少说,直接上代码
(一)Facade模式实例
var net=new Object();
net.READY_STATE_UNINITIALIZED=0;
net.READY_STATE_LOADING=1;
net.READY_STATE_LOADED=2;
net.READY_STATE_INTERACTIVE=3;
net.READY_STATE_COMPLETE=4;
net.ContentLoader=function(url,onload,onerror){
this.url=url;
this.req=null;
this.onload=onload;
this.onerror=(onerror) ? onerror : this.defaultError;
this.loadXMLDoc(url);
net.ContentLoader.prototype={
loadXMLDoc:function(url){
if (window.XMLHttpRequest){
this.req=new XMLHttpRequest();
} else if (window.ActiveXObject){
this.req=new ActiveXObject("Microsoft.XMLHTTP");
}
if (this.req){
try{
var loader=this;
this.req.onreadystatechange=function(){
loader.onReadyState.call(loader);
}
this.req.open('GET',url,true);
this.req.send(null);
}catch (err){
this.onerror.call(this);
}
}
},
onReadyState:function(){
var req=this.req;
var ready=req.readyState;
if (ready==net.READY_STATE_COMPLETE){
var httpStatus=req.status;
if (httpStatus==200 || httpStatus==0){
this.onload.call(this);
}else{
this.onerror.call(this);
}
}
},
defaultError:function(){
alert("error fetching data!"
+"\n\nreadyState:"+this.req.readyState
+"\nstatus: "+this.req.status
+"\nheaders: "+this.req.getAllResponseHeaders());
}
}
(二)Adapter模式实例
var xhr = new XMLHttpRequest();
xhr.open("GET", "myData.xml");
xhr.onreadystatechange = function(){
if(xhr.readyState == 4){
alert(xhr.responseXML);
}
}
xhr.send(null);
(三)Observer模式实例
window.onloadListeners=new Array();
window.addOnLoadListener(listener){
window.onloadListeners[window.onloadListeners.length]=listener;
}
window.onload=function(){
for(var i=0;i<window.onloadListeners.length;i++){
var func=window.onlloadListeners[i];
func.call();
}
}
(四)Singleton模式实例
var SingletonObj = {
property1: value1,
property2: value2,
...
method1:function(){
...
}
method2:function(){
...
}
...
}
function getSingletonObj() {
if(!top.SingletonObj) {
var top.SingletonObj = {
...
}
top.SingletonObj.init(...);
}
return top.SingletonObj;
}
(五)Command模式实例
function buttonOnclickHandler(event){
var data=calculate();
showData(dataTable,data);
}
function ajaxOnloadHandler(){
var data=calculate();
showData(otherDataTable,data);
}
function calculate(){
var data=new Array();
data[0]=6;
data[1]=data[0]/3;
data[2]=data[0]*data[1]+7;
return data;
}
function showData(table,data){
var newRow=createTableRow(table);
for (var i=0;i<data.length;i++){
createTableCell(newRow,data[i]);
}
}
buttonDiv.onclick=buttonOnclickHandler;
poller.onload=ajaxOnloadHandler;
(六)MVC应用实例
function Button(value,domEl){
this.domEl=domEl;
this.value=value;
this.domEl.buttonObj=this;
this.domEl.onclick=this.clickHandler;
}
Button.prototype.clickHandler=function(){
var buttonObj=this.buttonObj;
var value=(buttonObj && buttonObj.value) ?
buttonObj.value : "unknown value";
alert(value);
}
1.跨浏览器不一致性:Facade和Adapter模式
getLeft(e)来自Mike Foster的x库的一个函数简化版本。这个函数接受一个参数e,以一种全面的方式发现这个DOM元素的左边界的像素位置。
Facade的模式:
定义一个函数来隐藏代码,这使得其他代码更加容易阅读,并且将对象检测代码集中到了一个地方。如果发现在某种边界情况下对象检测代码不能正常工作,那么只需要在一个地方修改,就可以将影响扩散到所有调用它的代码中,这就是重构的一个基本原则,
Facade模式可以用来为一个服务或者一些功能的不同实现方式提供公共的访问点。
Adapter模式:
与Facade不同,我们为其中的一个子系统提供了一个额外的层,使得这个子系统展现出与另一个子系统相同的API。这个层称作适配器层(adapter)。
例:用Adapter模式,开发一个控件,使IE的ActiveX控件看起来像是与Mozilla内建的XMLHttpRequest对象一样。
2.管理事件处理函数:Observer模式
Observer模式: 一个操作应该是谁的职责?询问这个问题有些时候是很有帮助的。在这个组合函数的解决方案中,window对象负责获得到DOM元素的引用,随后window对象必须知道当前页面中包括哪些子系统。理想情况下,每个子系统应该自己负责获取它们需要的引用。按照这种方式,如果它包括在页面中,就会获得自己需要的引用;如果没有包括在页面中,就不必做这件事情。
//为了清晰地分离这个职责,可以允许这些系统通过传递一个函数来登记,从而在发生onload事件时得到通知,这些函数会在window.onload事件触发时调用。这里是一个简单的实现:
window.onloadListeners=new Array();
window.addOnLoadListener(listener){
window.onloadListeners[window.onloadListeners.length]=listener;
}
//窗口完全加载后,window对象只需要遍历这个数组,并且依次调用每个方法:
window.onload=function(){
for(var i=0;i<window.onloadListeners.length;i++){
var func=window.onlloadListeners[i];
func.call();
}
}
3 重用用户操作处理函数:Command模式
在面向对象语言的传统Command模式中,用户的交互都封装为Command对象,通常继承自一个基类或者实现一个接口。在这里我们使用一种略微不同的方法来解决相同的问题。因为在JavaScript中,函数本身就是头等对象,我们可以直接将它们当作Command对象来处理,与此同时仍然提供了相同的抽象级别。
将用户所做的事情都封装为Command对象可能看起来有点麻烦,但是这样做是有回报的。当所有的用户行为都封装在Command对象中时,我们就可以很容易地联合使用其他标准的功能。讨论最多的扩展是增加undo()方法,一旦完成了这个工作,就为在整个应用中提供通用的撤销(undo)功能奠定了良好的基础。
在一个更加复杂的例子中,Command在执行时可以被记录在一个栈中,用户可以通过撤销按钮来回退这个栈,从而将应用返回到以前的状态。
每个新的Command对象都放在栈的顶端,可以按顺序逐个回退。用户通过一系列写的操作创建了一个文档,然后选择整个文档时,一不小心点了删除按钮。当调用undo功能时,从栈中弹出最顶端的条目,然后调用它的undo()方法,恢复被删除的文本。后续的撤销操作可能是取消文本的选择,等等。
当然,使用Command模式来创建一个撤销栈,还要确保这些执行和撤销操作的组合能够返回系统的初始状态,对于开发者来说这意味着一些额外的工作。提供完善的撤销功能可以使得产品显得与众不同,特别是对于频繁或长时间使用的应用来说,这个功能更加重要。
4 保持对资源的唯一引用:Singleton模式
一个对象只有一个实例,有时也描述为一个单例(singleton)。
Java中的单例
Java的语言中,实现单例的方法通常是隐藏对象的构造函数,并且提供一个getter方法,基于Java的解决方案利用private和public的访问修饰符来强化单例的行为
JavaScript中的单例
们可以按照平常的方式来定义TradingMode对象:
function TradingMode(){
this.mode=MODE_RED;
}
TradingMode.prototype.setMode=function(){
}
然后提供一个全局变量作为一个伪单例:
TradingMode.instance=new TradingMode();
但是这无法阻止恶意代码调用构造函数。另一方面,我们可以不使用原型,手工创建整个对象:
var TradingMode = new Object();
TradingMode.mode = MODE_RED;
TradingMode.setMode = function() {
...
}
也可以用更加简洁的方式来定义它:
var TradingMode = {
mode:MODE_RED,
setMode:function(){
...
}
};
分享到:
相关推荐
以下是对标题和描述中提到的几种JavaScript面向对象编程模式的详细解释: 1. **构造函数与字面量结合模式** 在JavaScript中,我们可以通过构造函数和字面量语法来创建对象。构造函数用于定义对象的类型,而字面量...
本篇文章将深入探讨JavaScript中实现继承的几种常见方式。 1. 原型链继承 JavaScript的原型(prototype)机制是实现继承的基础。每个函数都有一个prototype属性,这个属性指向一个对象,这个对象的属性和方法可以被...
《JavaScript模式》一书深入探讨了这种语言中的设计模式和最佳实践,旨在帮助开发者提升代码质量和可维护性。作者Stoyan Stefanov是知名的前端工程师,而中文版由陈新译,确保了内容对中国读者的友好性。 一、简介 ...
JavaScript树结构菜单是一种通过树状结构组织菜单项,允许用户通过展开和折叠节点来导航的应用程序界面组件。本文将详细介绍三种不同的JavaScript树结构菜单类型:悬浮层树、右键菜单树和节点树,以及它们的设计和...
本文将深入探讨JavaScript中的几种常见内存泄露模式,并提供相应的解决方案。 1. **全局变量和闭包引用** 全局变量生命周期长,如果没有正确释放,可能导致内存占用过多。闭包可以访问并保持对外部作用域的引用,...
本书中探讨了几种最新的模块化模式: - **AMD(Asynchronous Module Definition)**:异步加载模块的标准。 - **CommonJS**:用于服务器端JavaScript的模块化规范。 - **ES Harmony**:ECMAScript的新版本,引入了...
JavaScript定义类的几种方式包括工厂方式、构造函数和原型方式,每种方法都有其特点和适用场景,接下来我们将详细探讨。 工厂方式是最早期的面向对象编程在JavaScript中的实践之一。使用工厂方式定义类,本质上就是...
第二部分则专注于各种具体的设计模式及其在JavaScript语言中的应用,主要介绍了工厂模式、桥接模式、组合模式、门面模式等几种常见的模式。为了让每一章中的示例都尽可能地贴近实际应用,书中同时列举了一些...
在JavaScript中实现享元模式时,我们需要关注几个角色: 1. 客户端(Client):客户端是调用享元工厂来获取对象的类,通常指的是应用中需要用到对象的部分。 2. 享元工厂(Flyweight Factory):负责创建和管理享...
JavaScript中定义类或函数,主要有以下几种方式: 1. 工厂方式 工厂方式是JavaScript中创建对象的一种模式,它通过一个工厂函数来封装创建对象的代码。通过工厂函数,我们可以创建多个具有相同属性和方法的对象实例...
### JavaScript设计模式知识点详解 #### 一、设计模式概述与...以上介绍了几种常用的JavaScript设计模式及其应用场景。每种模式都有其独特的优点和适用场景,合理运用这些设计模式能够显著提升代码的质量和可维护性。
本文将深入探讨在JavaScript中定义对象的几种常见方式,包括工厂模式、构造函数、原型以及继承。 1. 工厂方式定义对象: 工厂模式是一种创建对象的抽象方式,通过函数来创建具有相似特性的对象。这种方式的主要...
2. **对象和原型**:JavaScript的对象是一种基于原型的模式,这意味着对象可以从其他对象继承属性和方法。书中详细解释了如何创建和操作对象,以及原型链的工作原理。 3. **函数作为一等公民**:在JavaScript中,...
JavaScript 是一种动态类型的编程语言,其核心特性之一就是原型继承。在JavaScript中,对象可以通过原型链实现继承,这是JavaScript中实现面向对象编程的重要方式。本文将详细介绍JavaScript中的三种主要继承方法:...
首先,JavaScript的高级特性通常涵盖以下几个方面: 1. **闭包(Closures)**:闭包是一种特殊的函数,它能够记住并访问其定义时的作用域,即使这个作用域在函数执行时已经不存在了。利用闭包可以实现数据封装和...
1. **自动化任务**:JavaScript提供了一种强大的方式来自动化重复性的Photoshop操作,如批处理图像调整、图层管理、导出文件等,极大地提高了工作效率。 2. **插件开发**:开发者可以通过JavaScript编写插件,扩展...
本文将深入探讨JavaScript中创建对象的几种常见方式以及对象方法。 首先,我们来看“工厂模式”。工厂模式是一种创建对象的抽象方式,通过一个函数来返回一个新的对象。例如: ```javascript function getObj(name...
在这个“几个经典JavaScript控件下载”的压缩包中,包含了几个实用的JavaScript组件,这些组件可以帮助开发者创建更加交互性和用户友好的网页。 1. **表格格式的树示例**: 树形结构在数据展示中非常常见,例如...
- **定义**:工厂模式是一种创建型模式,它提供了一个创建对象的接口,但允许子类决定实例化哪个类。 - **应用场景**:当程序中需要创建的对象很多,并且每个对象都需要手工实例化时,可以使用工厂模式。 - **实现...