为什么需要原型呢当我们使用一个构造函数创建多个对象时每个对象可能都会拥有一些同样的属性和方法。这就导致对于每个对象而已这些属性和方法是完全一样的这些完全相同的东西被重复创建浪费内存资源。有没有一种方法可以共享这些公共的成员呢原型Prototype就是来解决这个问题的原型的基本概念什么是原型JavaScript中每个函数都会有一个对象属性 prototype称为原型对象function Students(name) { this.name name; } console.log(Students.prototype); // 输出原型对象实例和原型的关系当我们使用构造函数 new 一个对象时这个对象就被称为实例每个实例都有一个特殊的属性__proto__指向其构造函数的原型对象这个属性就被称为实例的隐式原型不就是先创建一个构造函数然后再 new 一个实例吗为什么搞这么多复杂的东西一个图片带你了解它们之间的关系可以看到构造函数和实例通过 prototype 与 __proto__共同指向了原型对象。当访问对象的成员时会先找对象自己如果不存在会从原型上去寻找。那我们就可以把一些公共的重复的东西放在原型中这样子就可以被所有的实例共享原型的实战使用代码实现// 构造函数 function Students(name,age) { this.name name this.age age } // 在构造函数的原型上添加一个 learn 方法共享给所有通过 Students 创建出来的实例 Students.prototype.learn function () { console.log(this.name 喜欢学习代码) } const s1 new Students(小樊,18) s1.learn() // 小樊喜欢学习代码 const s2 new Students(小杰,18) s2.learn() // 小杰喜欢学习代码在构造函数中我们并没有定义 learn 函数而在实例中可以直接调用这就是神奇的原型深入学习一层套一层的原型链什么是原型链现在我们已经了解原型的基本概念可以更深一步的学习原型的下一个知识点原型链众所周知所有对象都是 new 出来的。我们的原型对象也不例外。正常情况原型对象是通过 Object 创建出来的有这个理论基础再看 Students 构造函数它创建的实例 s1 指向了 Students 上的原型而 Students 上的原型指向了 Object 上的原型Object上的原型最终指向了 null。我们再看一张图从图片中可以看出s1 的原型形成了一条连贯的链式结构这个就是原型链。原型链的查找机制一开始说过当访问实例的成员时会先从自身上开始寻找如果不存在就开始在原型上找。现在我们学习了原型链可以非常直观的看到如果实例的原型上也找不到还会继续沿着原型链寻找直到找到 null 上面实在找不到的话那就真的没有了原型链带来的编程思想原型链给我们提供了更好的属性查找的机制。还有一个很重要的——原型链的继承是 JavaScript 中面对对象的基础总结与回顾总结原型解决的是对象公共成员频繁被创建的问题可以更好的优化我们的性能。优化建议1. 将不变的方法放在原型上2. 将经常变化的方法放在实例上最后我们要避免在运行时频繁的修改原型