定义

  • 原型模式是一个创建型模式
  • 创建基类的时候,简单差异化的属性放在构造函数中,相同的方法功能放在基类原型中

    代码示例

    ```javascript // 属性多为每一个实例单独的特有的,属性多为基本类型,占用内存空间小 function Person(name) { this.name = name; } // 方法一般为函数为引用类型,占用比较大的内存空间,最好可以复用 Person.prototype.getName = function () { console.log(this.name); return this.name; }; let p1 = new Person(“li”); let p2 = new Person(“po”);

console.log(p1.getName === p2.getName); console.log(p1.getName()); console.log(p2.getName());

  1. <a name="lnjjT"></a>
  2. ## 原型链
  3. - 访问一个对象的属性时,先在基本属性中查找,如果没有,沿着__proto__这条链向上找,这就是原型链
  4. - hasOwnProperty可以区分一个属性到底是自己的还是原型中找到的
  5. ```javascript
  6. function Foo(){
  7. this.a = 100
  8. }
  9. Foo.prototype.b = 200
  10. let f = new Foo()
  11. console.log(f.a) // 100
  12. console.log(f.b) // 200
  1. let fun=()=>{}
  2. let obj = {}
  3. Function.prototype.a = 100
  4. Object.prototype.b = 200
  5. console.log(fun.a, fun.b) // 100 200
  6. console.log(obj.a, obj.b) // undefined 200

原型的优势

  • 可以随意扩展
  • 可以重写继承的方法
    1. let arr = [1,2,3]
    2. console.log(Object.prototype.toString.call(arr)) //[object Array]
    3. console.log(arr.toString()) // 1,2,3
    说明Array.prototype.toString重写了Object.prototype.toString的方法

原型演示

  1. <canvas id="canvas" width="600" height="400"></canvas>
  2. <script>
  3. let canvas = document.getElementById("canvas");
  4. let ctx = canvas.getContext("2d");
  5. let circles = [];
  6. function getRandomColor() {
  7. let rand = Math.floor(Math.random() * 0xffffff).toString(16);
  8. if (rand.length == 6) {
  9. return "#" + rand;
  10. } else {
  11. return getRandomColor();
  12. }
  13. }
  14. function Circle(x, y, radius) {
  15. this.x = x;
  16. this.y = y;
  17. this.radius = radius;
  18. circles.push(this);
  19. }
  20. Circle.prototype.render = function () {
  21. ctx.beginPath();
  22. ctx.arc(this.x, this.y, this.radius, 0, 2 * Math.PI);
  23. ctx.fillStyle = getRandomColor();
  24. ctx.fill();
  25. };
  26. Circle.prototype.update = function () {
  27. this.radius--;
  28. if (this.radius > 0) {
  29. return true;
  30. }
  31. };
  32. canvas.onmousemove = function (event) {
  33. new Circle(event.clientX, event.clientY, 50 * Math.random());
  34. };
  35. setInterval(function () {
  36. ctx.clearRect(0, 0, 600, 400);
  37. circles.forEach((circle) => {
  38. circle.update() && circle.render();
  39. });
  40. }, 100);
  41. </script>

Snipaste_2020-09-13_18-57-20.png