原型模式(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 设计模式》 中。

最新文章

  1. windows 上vmare超卡的问题解决方案
  2. Win10 VS2015自动添加头注释
  3. setTimeout
  4. P6 EPPM 16 R1 文档和帮助系统
  5. UVA 624 (0 1背包 + 打印路径)
  6. 如何让静态库中的可执行程序不调用的函数不链接进该可执行程序?(-ffunction-sections -Wl,--gc-sections)
  7. Kafka consumer处理大消息数据问题
  8. 最近很多人问我:saiku下载不下来
  9. OpenCV和selenum实现点击操作
  10. matplotlib散点数据-【老鱼学matplotlib】
  11. Asp.net中web.config配置文件详解(二)
  12. nginx实践(四)之静态资源web服务(防盗链)
  13. 51nod1331 狭窄的通道
  14. sdoi&lt;序列计数&gt;
  15. PHP 小知识
  16. unity3d生命周期
  17. 重构改善既有代码设计--重构手法04:Replace Temp with Query (以查询取代临时变量)
  18. java版云笔记(六)之AOP
  19. kvm虚拟机克隆注意点
  20. 我的Linux之路——虚拟机linux与主机之间的文件传送

热门文章

  1. 关于python内存管理里的引用计数算法和标记-清楚算法的讨论
  2. NA交换①
  3. ExtJS ComboBox 下拉列表详细用法
  4. UVA 1397 - The Teacher&amp;#39;s Side of Math(高斯消元)
  5. Codeforces Beta Round #96 (Div. 1) C. Logo Turtle DP
  6. Google&#39;s Hybrid Approach to Research
  7. HTTP要点概述:十一,HTTP状态码
  8. 排名Top 100的Java类库
  9. gitlab-ce平台调试
  10. 3-1 todolist功能开发