返回
原型链,__proto__和prototype深入探究
前端
2023-10-02 01:13:27
prototype、__proto__和原型链简介
- prototype :一个函数的prototype属性引用一个对象(称为原型对象),用于定义和实现该函数所有实例 共有的属性和方法。
- proto :一个对象的__proto__属性引用其原型对象,是该对象继承自原型对象的所有属性和方法的来源。
- 原型链 :原型链是JavaScript中实现继承的一种机制,它通过__proto__属性将对象连接成一个链条,使每个对象都可以访问其原型对象的属性和方法,而原型对象又可以访问其自己的原型对象的属性和方法,以此类推,直至链条的尽头(通常是Object.prototype)。
prototype、__proto__和原型链的关系和区别
- prototype和__proto__都是指向原型对象(prototype对象)的引用,但从不同的角度来看:
- prototype是从函数的角度来看的,是函数的属性,用于定义和实现该函数所有实例共有的属性和方法。
- __proto__是从对象的角度来看的,是对象的属性,指向该对象继承自原型对象的所有属性和方法的来源。
- 原型链是JavaScript中实现继承的一种机制,通过__proto__属性将对象连接成一个链条,使每个对象都可以访问其原型对象的属性和方法,而原型对象又可以访问其自己的原型对象的属性和方法,以此类推,直至链条的尽头(通常是Object.prototype)。
prototype、__proto__和原型链在JavaScript中的应用
- 原型链继承 :JavaScript中没有类和继承,而是通过原型链来实现继承。当创建新对象时,该对象会从其构造函数的prototype属性继承属性和方法,而该构造函数的prototype属性又会从其原型对象的prototype属性继承属性和方法,以此类推,直至链条的尽头(通常是Object.prototype)。
- 原型扩展 :原型对象可以被扩展,以添加新的属性和方法,这些属性和方法可以被该原型对象的所有实例访问。例如,我们可以通过向Object.prototype对象添加新的属性和方法,来扩展所有JavaScript对象的原型。
- 对象属性查找 :当JavaScript引擎查找对象属性时,它会沿着原型链向上查找,直到找到该属性或到达原型链的尽头(通常是Object.prototype)。这使得JavaScript对象可以访问其原型对象的所有属性和方法,而无需显式地声明它们。
原型链、__proto__和prototype的常见误区
- prototype和__proto__是同一个东西 :prototype和__proto__虽然都是指向原型对象(prototype对象)的引用,但从不同的角度来看:
- prototype是从函数的角度来看的,是函数的属性,用于定义和实现该函数所有实例共有的属性和方法。
- __proto__是从对象的角度来看的,是对象的属性,指向该对象继承自原型对象的所有属性和方法的来源。
- 原型链继承是JavaScript中唯一的继承机制 :JavaScript中还有另一种继承机制,称为组合继承,它通过将多个对象的属性和方法组合成一个新对象来实现继承。