原型:JS中的对象都包含了一个prototype的内部属性,这个属性所对应的就是该对象的原型。
b71b2cb49be914e6586151ebecd7927.png

1.原型

1.1 prototype 和 proto

所有实例对象都有proto属性指向构造该对象的原型(构造函数的属性 prototype)。(看下列代码第十五行注释)

  1. <script>
  2. //新建一个构造函数
  3. var name = "马化腾"
  4. function Person(name,age){
  5. this.name = name;
  6. this.age = age;
  7. }
  8. Person.prototype.sayName=function(){
  9. console.log(this.name);
  10. }
  11. var bb = new Person("马云",56);
  12. console.log(bb);
  13. console.log(bb.__proto__);
  14. console.log(Person.prototype);
  15. //Person.prototype==bb.__proto__
  16. bb.sayName();
  17. //首先先看构造函数里面有没有sayName方法,没有就去__proto__原型里面看有没有,没有就在进入下一层级__proto__原型看有没有
  18. </script>

关系图:

3.原型和原型链 - 图2

2.原型链

当访问一个对象的某个属性时,会先在这个对象本身属性上查找,如果没有找到,则会去它的__proto__隐式原型上查找,即它的构造函数的prototype,如果还没有找到就会再在构造函数的prototype__proto__中查找,这样一层一层向上查找就会形成一个链式结构,我们称为原型链
示例:

  1. function Parent(month){
  2. this.month = month;
  3. }
  4. var child = new Parent('Ann');
  5. console.log(child.month); // Ann
  6. console.log(child.father); // undefined

在child中查找某个属性时,会执行下面步骤

3.原型和原型链 - 图3