一,什么是原型模式

原型模式(Prototype):用原型实例指向创建对象的类,使用于创建新的对象的类共享原型对象的属性以及方法

  1. // 图片轮播类
  2. var LoopImages = function(imgArr, container) {
  3. this.imagesArray = imgArr; // 轮播图片数组
  4. this.container = container; // 轮播图片容器
  5. }
  6. LoopImages.prototype = {
  7. // 创建轮播图片
  8. createImage: function() {
  9. console.log('LoopImages createImage function');
  10. },
  11. // 切换下一张图片
  12. changeImage: function() {
  13. console.log('LoopImages changeImage function');
  14. }
  15. }
  16. // 上下滑动切换类
  17. var SlideLoopImg = function(imgArr, container) {
  18. // 构造函数继承图片轮播类
  19. LoopImages.call(this. imgArr, container);
  20. }
  21. SlideLoopImg.prototype = new LoopImages(); // 原型继承图片轮播类
  22. // 重新继承的切换下一张图片的方法
  23. SlideLoopImg.prototype.changeImage = function() {
  24. console.log('SlideLoopImg changeImage function');
  25. }
  26. // 渐隐切换类
  27. var FadeLoopImg = function(imgArr, container, arrow) {
  28. LoopImages.call(this. imgArr, container);
  29. // 切换箭头私有变量
  30. this.arrow = arrow;
  31. }
  32. FadeLoopImg.prototype = new LoopImages();
  33. FadeLoopImg.prototype.changeImage = function() {
  34. console.log('FadeLoopImg changeImage function');
  35. }

测试用例:

  1. var imgArr = ['01.jpg', '02.jpg', '03.jpg'];
  2. var container = 'slide';
  3. var arrow = ['left.jpg', 'right.jpg'];
  4. var fadeImg = new FadeLoopImg(imgArr, container, arrow);
  5. console.log(fadeImg.container); // slide
  6. fadeImg.changeImage(); // FadeLoopImg changeImage function

二,原型的拓展

  1. LoopImages.prototype.getImageLength = function() {
  2. return this.imagessArray.length;
  3. }
  4. FadeLoopImg.prototype.getContainer = function() {
  5. return this.container;
  6. }
  7. console.log(fadeImg.getImageLength()); // 4
  8. console.log(fadeImg.getContainer()); // slide

三,原型的继承

基于已经存在的模板对象克隆出新对象的模式

  1. function prototypeExtend() {
  2. var F = function() {},
  3. args = arguments,
  4. i = 0,
  5. len = args.length;
  6. for (; i < len; i++) {
  7. // 遍历每个模板对象中的属性
  8. for (var j in args[i]) {
  9. // 将这些属性复制到缓存类原型中
  10. F.prototype[j] = args[i][j];
  11. }
  12. }
  13. return new F();
  14. }
  1. // 创建一个企鹅基类
  2. var penguin = prototypeExtend({
  3. speed: 20,
  4. swim: function() {
  5. console.log('游泳速度:' + this.speed);
  6. },
  7. run: function(speed) {
  8. console.log('奔跑速度:' + speed);
  9. },
  10. jump: function() {
  11. console.log('跳跃动作');
  12. },
  13. })
  14. penguin.swim(); // 游泳速度:20
  15. penguin.run(10); // 奔跑速度:10
  16. penguin.jump(); // 跳跃动作