返回

揭秘JavaScript的原型和原型链:了解对象关系的艺术

前端

认识原型和原型链

JavaScript采用原型和原型链的机制来实现继承。原型,顾名思义,就是对象的原型模板。每个对象都有一个__proto__属性,指向其原型对象,而原型对象的constructor属性指向构造函数。举个例子,如下代码:

function Person(name, age) {
  this.name = name;
  this.age = age;
}

const person = new Person('John', 30);

person对象是Person构造函数的实例,它的__proto__属性指向Person.prototype,即Person构造函数的prototype属性。因此,person对象可以访问Person.prototype上的所有属性和方法,就好像它们是person对象自身的一样。

原型链上的方法查找

当访问对象属性或方法时,JavaScript会沿着原型链向上查找。如果在当前对象中找不到该属性或方法,它就会去原型对象中寻找,依此类推,直到找到该属性或方法,或者到达原型链的末端(Object.prototype)。

person.name; // "John"
person.age; // 30
person.introduce(); // "Hello, my name is John and I am 30 years old."

在上面的代码中,person对象没有introduce方法,但它的原型对象Person.prototype有。因此,当调用person.introduce()时,JavaScript会沿着原型链向上查找,在Person.prototype中找到introduce方法并执行它。

修改原型对象的影响

修改原型对象上的属性或方法会影响到所有继承自该原型的对象。例如,如果我们修改Person.prototype.introduce方法,如下所示:

Person.prototype.introduce = function() {
  return `Hello, my name is ${this.name} and I am ${this.age} years old.`;
};

那么,所有Person构造函数的实例都会继承这个修改后的introduce方法,包括person对象。这意味着,person.introduce()现在会返回不同的结果:

person.introduce(); // "Hello, my name is John and I am 30 years old."

总结

原型和原型链是JavaScript对象系统的重要组成部分。它们允许对象共享属性和方法,并支持继承。理解原型和原型链对于理解JavaScript的运作方式非常重要。