Prototype Chain 对象原型链
对象原型链是 JavaScript 中的继承机制,用于查找对象的属性和方法。
原型链规则
- 当访问一个对象的属性或方法时,JavaScript 会首先检查该对象自身是否包含该属性或方法。
- 如果该对象自身没有该属性或方法,JavaScript 会查找该对象的原型 (
__proto__
),即指向另一个对象的内部链接。 - JavaScript 将沿着原型链继续查找,直到找到目标属性或方法,或到达原型链的终点 (
null
),如果仍未找到,则返回undefined
。
__proto__
和 prototype
的关系补充
- 区别:
__proto__
是每个对象实例都有的属性,它指向的是该对象的原型对象。而prototype
是构造函数的属性,它是创建该构造函数的实例对象时所继承的原型对象。 - 链接关系:当你创建一个对象实例时,构造函数的
prototype
对象将被赋值给这个实例的__proto__
属性。换句话说,__proto__
是一个对象实例与其构造函数的prototype
对象之间的链接。
设计对象原型链的目的
- 内存优化:通过共享方法的方式来减少内存使用。例如,在构造函数中定义的方法会被所有实例共享,而不是在每个实例上都复制一遍。这种设计减少了重复代码,优化了性能。
- 代码结构:使用原型链可以使代码结构更加清晰和模块化。对象可以通过继承的方式扩展,增强代码的可维护性和扩展性。
对象原型链与作用域链的比较
对象原型链和作用域链在结构上不同,但它们都用于查找特定内容(属性或变量),且查找过程都涉及沿着链条向上查找。
- 对象原型链:用于查找对象的属性和方法。如果一个对象自身没有找到某个属性或方法,会沿着原型链向上查找其原型。
- 作用域链:用于查找代码中的变量。在代码执行时,如果在当前作用域中找不到某个变量,则会沿着作用域链向上查找父级作用域中的变量。