目录
1. prototype(原型对象)
- 定义与性质:在 JavaScript 里,每个构造函数都自带一个prototype属性,这个属性指向的就是原型对象。它就像是一个公共的 “代码库”,为后续创建的实例对象提供共享方法的基础。
- 作用:其主要作用是实现方法的共享。当有一些通用的、不会因实例不同而改变的方法时,将它们定义在prototype对象上是个不错的选择。
2. constructor 属性
- 所在位置:constructor属性既存在于prototype原型对象内部,也存在于对象原型__proto__中。
- 指向关系:这个属性就像一个 “导航指针”,始终指向创建实例对象或者原型的构造函数,它建立起了原型与构造函数之间的联系,让我们能追溯到对象的创建源头。
- 特殊情况与处理:当以对象字面量形式重新赋值原型对象,一次性添加多个对象方法时,虽然能快速扩充原型功能,但会覆盖原来原型对象的内容,导致原本指向正确的constructor属性不再指向当前构造函数。为确保其正确指向,需要手动添加constructor属性,并赋值为原来的构造函数。比如执行Person.prototype = {name: 'default', age: 0};后,要紧接着添加Person.prototype.constructor = Person; ,以此维持原型与构造函数之间的正确关联。
3. __proto__属性
- 性质:__proto__属性是 JavaScript 中的非标准属性,含义与[[prototype]]一致,虽然它不是正统属性,但作用十分关键。
- 所在位置与指向:这个属性存在于每一个实例对象中,它像一座桥梁,连接着实例对象和构造函数的prototype原型对象。正因为有了这座 “桥梁”,实例对象才能访问和使用构造函数原型对象上定义的属性和方法,实现对象之间的属性和方法继承。
- 自身属性:通过__proto__属性,实例对象不仅能获取原型对象的属性和方法,而且由__proto__指向的原型对象自身携带的constructor属性,同样精准地指向创建该实例对象的构造函数,进一步强化了对象与构造函数之间的联系。
4. this 指向
在 JavaScript 的构造函数和原型对象的方法内部,this关键字始终指向通过该构造函数实例化产生的具体对象。以Person构造函数及其Person.prototype中的方法为例,在这些方法执行过程中,this代表的就是一个个具体创建出来的Person实例,这方便我们在编写代码时操作和访问实例对象的属性和方法,实现面向对象编程的各种功能。
5. 原型链概念
- 定义与形成:原型链是 JavaScript 中实现继承和属性查找的核心机制。当访问一个对象的属性或方法时,如果在当前对象自身没有找到对应的属性或方法,JavaScript 引擎就会沿着__proto__属性所指向的原型对象继续查找,若原型对象上也没有找到,就会继续向上查找原型对象的原型,以此类推,直到找到目标属性或方法,或者到达原型链的顶端null(Object.prototype.__proto__的值为null)。这样层层链接的原型对象构成的链条,就被称为原型链。
- 作用与意义:原型链的存在使得 JavaScript 能够实现基于原型的继承,让对象可以复用其他对象的属性和方法,极大地提高了代码的可维护性和复用性。例如,数组对象[1, 2, 3]可以通过原型链访问到Array.prototype上定义的push、pop等方法,而Array.prototype又通过原型链继承了Object.prototype上的toString、hasOwnProperty等通用方法,这使得对象的属性和方法组织更加合理有序,减少了重复代码的编写。
6. JavaScript 中原型链的查找规则
在 JavaScript 中,当访问对象的属性(包括方法)时,遵循以下查找规则:
- 对象自身属性优先:首先检查对象自身是否定义了该属性。对象自身定义的属性具有最高优先级。例如,创建一个person对象let person = {name: "Alice"},访问person.name时,会直接从对象自身获取该属性。
- 原型查找:若对象自身未定义该属性,则查找其原型(即__proto__指向的prototype原型对象)。例如,通过构造函数function Person() {}; Person.prototype.age = 20; let person = new Person();创建的person对象,其自身没有age属性,此时便会从原型中查找。
- 原型的原型查找:若在原型中仍未找到该属性,则继续查找原型对象的原型,即Object的原型对象。由于所有对象最终都继承自Object,Object的原型包含了一些通用方法,如toString等。
- 查找终止条件:按照上述规则,持续查找直至Object的原型。Object的原型__proto__为null,当查找到null时,查找过程结束。这一系列查找过程形成了一个链式结构,即原型链。
- __proto__的作用:__proto__对象原型的重要意义在于,它为对象成员查找提供了明确的方向和路线,将对象及其各级原型串联起来,构成了原型链的基础结构。
- instanceof运算符:可以使用instanceof运算符来检测构造函数的prototype属性是否存在于实例对象的原型链上。例如,let person = new Person(); console.log(person instanceof Person);,该语句将返回true,因为Person.prototype位于person的原型链上。