什么是原型:
1, 我们所创建的每一个函数, 解析器都会向该函数对象添加一个属性 prototype, 这个属性指向一个对象, 这个对象就是我们所谓的原型对象
2, 如果我们将函数作为普通函数调用时, prototype 基本没有任何作用; 当函数作为构造函数使用时, 构造函数所创建的对象中都会有一个隐含属性, 这个隐含属性指向创建它的构建函数的原型对象 (好像有点绕......), 我们可以通过__proto__来访问该属性
3, 原型对象就相当于一个公共的区域, 所有同一个类的实例都可以访问到这个原型对象 (我们可以将对象中共有的内容, 统一设置到原型对象中)
使用方法或者属性时的一个内部查找顺序 (有必要知晓):
(1) 当访问一个对象的属性 / 方法时, 首先查找这个对象自身有没有该属性
(2) 如果没有就查找它的原型 (也就是__proto__指向的构造函数 prototype 原型对象)
(3) 如果还没有找到就查找原型对象的原型, 就是 prototype.__proto__, 它应该是指向 Object 构造函数的原型对象 - 我理解为原型对象是由 Obejct 这个构造函数创建的
(4) 依次类推, 如果还没有, 则它会查找 Object 构造函数原型的原型, 也就是 Object 构造函数的 prototype.__proto__, 如果打印它, 你会发现它是 null
原型链:
ps: 有没有觉得很像一个链条呢
总结:
我们这里需要重点知晓的是, 原型对象也是对象, 是对象就是用构造函数创建出来的, 而最终他们都指向 Object 的构造函数的原型对象的原型对象, 也就是 null; 事实上, 我们可以把 Object 构造函数当做是一切对象的祖先 (包括 Function 构造函数, 它的__proto__也是指向 Object), 还需要知晓 JS 内部查找属性和方法的一个规则, 熟知这些, 那么理解原型和原型链就没什么难度了
嗯嗯......, 写的好像有点乱, 如果有大佬发现此文中的错误, 可以指正出来, 毕竟才接触前端没多久, 只是个人对原型的一些总结和理解, 如果后续有更深入的理解或有更简洁的描述, 会再进行补充或修改
来源: https://www.cnblogs.com/xfMeng/p/12771200.html