JavaScript设计模式 (1) 原型模式
2024-08-30 20:58:09
原型模式(Prototype):用原型实例指向创建类对象,使用于创建新对象的类共享原型对象的属性以及方法。
//图片轮播类
var LoopImages = function (imgArr, container) {
this.imagesArray = imgArr;//轮播图片数组
this.container = container;//轮播图片容器
}; LoopImages.prototype = {
//创建轮播图片
createImage: function () {
console.log('LoopImages createImage function');
},
//切换下一张图片
changeImage: function () {
console.log('LoopImages changeImage function');
}
}; //上下滑动切换类
var SlideLoopImg = function (imgArr, container) {
//构造函数继承图片轮播类
LoopImages.call(this, imgArr, container);
};
SlideLoopImg.prototype = new LoopImages();
//重写继承的切换下一张图片方法
SlideLoopImg.prototype.changeImage = function () {
console.log('SlideLoopImg changeImage function');
}; //渐隐切换类
var FadeLoopImg = function (imgArr, container,arrow) {
//构造函数继承图片轮播类
LoopImages.call(this, imgArr, container);
this.arrow = arrow;
};
FadeLoopImg.prototype = new LoopImages();
//重写继承的切换下一张图片方法
FadeLoopImg.prototype.changeImage = function () {
console.log('FadeLoopImg changeImage function');
};
原型继承
原型模式更多的是用在对象的创建上。比如创建一个实例对象的构造函数比较复杂,或者耗时比较长,或者通过创建多个对象来实现。此时我们最好不要用new关键字去复制这些基类,但可以通过对这些对象属性或者方法进行负责来创建实例,这是原型模式的最初思想。如果涉及多个对象,我们也可以通过原型模式来实现对新对象的创建。那么首先要有一个原型模式的对象复制方法。
/**********
*基于已经存在的模版对象克隆出新对象的模式
*arguments[0],arguments[1],arguments[2]:参数1,参数2.参数3表示模版对象
*注意。这里对模版引用类型on个的属性实质上进行了浅复制(引用类型属性共享),当然根据需求可以自行深复制。
******/
function prototypeExtend() {
var F = function () { },
args = arguments,
i = 0,
len = args.length;
for (var i = 0; i < len; i++) {
//遍历每个模版对象中的属性
for (var j in args[i]) {
//将这些属性复制到缓存类原型中
F.prototype[j] = args[i][j];
}
}
//返回缓存类的一个实例
return new F();
}
比如企鹅游戏中我们创建一个企鹅对象,如果游戏中没有企鹅基类,只是提供了一些动作模版对象,我们就乐意通过实现对这些模版对象的继承来创建一个企鹅对象。
var penguin = prototypeExtend({
speed: 20,
swim: function () {
console.log('游泳速度' + this.speed);
}
}, {
run: function (speed) {
console.log('奔跑速度' + speed);
}
}, {
jump: function () {
console.log('跳跃动作');
}
});
既然通过prototypeExtend创建的是一个对象,我们就无需再用new去创建新的实例对象,我们可以直接使用这个对象。
penguin.swim();//游泳速度 20
penguin.run(10);//奔跑速度 10
penguin.jump();//跳跃动作
学习《JavaScript 设计模式》 中。
》
最新文章
- windows 上vmare超卡的问题解决方案
- Win10 VS2015自动添加头注释
- setTimeout
- P6 EPPM 16 R1 文档和帮助系统
- UVA 624 (0 1背包 + 打印路径)
- 如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections)
- Kafka consumer处理大消息数据问题
- 最近很多人问我:saiku下载不下来
- OpenCV和selenum实现点击操作
- matplotlib散点数据-【老鱼学matplotlib】
- Asp.net中web.config配置文件详解(二)
- nginx实践(四)之静态资源web服务(防盗链)
- 51nod1331 狭窄的通道
- sdoi<;序列计数>;
- PHP 小知识
- unity3d生命周期
- 重构改善既有代码设计--重构手法04:Replace Temp with Query (以查询取代临时变量)
- java版云笔记(六)之AOP
- kvm虚拟机克隆注意点
- 我的Linux之路——虚拟机linux与主机之间的文件传送
热门文章
- 关于python内存管理里的引用计数算法和标记-清楚算法的讨论
- NA交换①
- ExtJS ComboBox 下拉列表详细用法
- UVA 1397 - The Teacher&;#39;s Side of Math(高斯消元)
- Codeforces Beta Round #96 (Div. 1) C. Logo Turtle DP
- Google&#39;s Hybrid Approach to Research
- HTTP要点概述:十一,HTTP状态码
- 排名Top 100的Java类库
- gitlab-ce平台调试
- 3-1 todolist功能开发