原型与原型链
一、什么是原型
- 每一个JavaScript 对象(null 除外)在创建时会与之关联另一个对象,这个被关联的对象称之为原型(原型对象)。
- 每一个对象都会从原型中‘继承’(委托)原型对象的属性。
- 每个函数(箭头函数除外)都有一个特殊的属性叫作原型(prototype),这个属性指向调用该构造函数而创建的实例的原型。
- 原型对象中有一个属性constructor, 它指向函数对象。
二、什么是prototype
- prototype就是显示原型。
- prototype是函数才有的属性,这个属性指向调用该构造函数而创建的实例的原型。
- 指向原型对象。
- 箭头函数是没有 prototype 属性的。
- prototype 被定义为:给其它对象提供共享属性的对象。
- 并不是所有的函数都有 prototype 属性,由函数 bind()方法返回的函数就没有 prototype 属性。
- 函数的 prototype 属性,在定义函数时自动添加 prototype,默认是一个空 Object 对象。
prototype的作用:
它的作用就是包含可以由特定类型的所有实例共享的属性和方法,也就是让该函数的实例化对象们都可以找到公用的属性和方法。
即:节省内存空间,实现数据共享
三、什么是 __ proto __
- __ proto __就是隐式原型。
- 每一个 JavaScript 对象( null 除外)都有一个属性,叫 __ proto __ ,这个属性指向该对象的原型。
- 指向原型对象。
- 所有的函数都是 Function 函数的实例(包括Function自己),所以他们的 __ proto __ 自然也就都指向 Function 原型对象(Function.prototype)。
- Object函数是所有对象通过原型链追溯到最根的构造函数。Object 函数的 prototype 中的 __ proto __ 指向 null。
__ proto __(隐式原型对象)的作用:
当访问一个对象的属性或方法时,如果该对象内部不存在这个属性,那么就会从它的 __ proto __ 属性所指向的(原型)对象中寻找(原型也是对象,也有它自己的原型),如果原型对象中也找不到,就会继续在该原型对象的原型对象中找,以此类推,直到找到属性或方法为止,或者查找到顶层原型对象 null,就结束查找,返回 undefined。
四、什么是 constructor
- 每个原型都有一个 constructor 属性指向关联的构造函数。
- constructor 属性的终点就是 Function 这个函数。
- Function 这个对象比较特殊,它的构造函数就是它自己。
五、原型/构造函数/实例之间的关系
六、原型链
1、什么是原型链:
- 当读取实例对象的属性时,如果找不到,就会查找与该对象关联的原型对象中的属性,如果还查不到,就去找原型的原型,一直找到为止,或者查找到顶层原型对象
null,就结束查找,返回 undefined。在此过程中,由互相关联的原型组成的链状结构就是 原型链。
2、原型链中查找属性方法和访问原型链中的原型对象的区别:
- 在原型链中查找属性或方法,如果没有查找到相关属性或方法,返回的是 undefined,表示原型链中没有该属性或方法。
- 而通过访问原型链中的原型对象,到达原型链终点,即 Object.prototype 的值为 null。
以上是我根据两个网站的文档做的简单的总结,更加深入具体的内容请前往这两个网站查看: