返回

从原型到原型链:揭秘JavaScript的面试经典问题

前端

在JavaScript开发中,原型和原型链是一个永恒的话题,也是面试中的经典问题。理解原型和原型链的概念对于深入理解JavaScript语言至关重要。在本篇文章中,我们将通过深入浅出的讲解,揭秘原型和原型链的神秘面纱,并分享一些面试中常见的原型链相关问题。

原型(prototype)

每个函数都有一个prototype属性,该属性指向一个对象,这个对象就是该函数的原型对象。原型对象可以包含属性和方法,这些属性和方法会被函数的所有实例继承。

例如,以下代码定义了一个名为Person的函数:

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

Person函数的prototype属性指向一个对象,该对象包含一个名为sayHello的方法:

Person.prototype.sayHello = function() {
  console.log("Hello, my name is " + this.name);
};

现在,我们可以使用Person函数创建Person的实例:

const person1 = new Person("John");
const person2 = new Person("Mary");

person1和person2都是Person函数的实例,它们都继承了Person.prototype对象中的属性和方法。因此,我们可以调用person1和person2的sayHello()方法来输出它们的姓名:

person1.sayHello(); // 输出:Hello, my name is John
person2.sayHello(); // 输出:Hello, my name is Mary

原型链(prototype chain)

每个对象都有一个内部属性[[Prototype]],该属性指向该对象的原型对象。对象的原型对象又是另一个对象的原型对象,如此递归下去,直到遇到null。这个从对象到其原型对象再到其原型对象的原型对象,一直到null的链条称为原型链。

例如,Person函数的原型对象是Person.prototype,Person.prototype的原型对象是Object.prototype,Object.prototype的原型对象是null。因此,person1和person2的原型链如下:

person1 -> Person.prototype -> Object.prototype -> null
person2 -> Person.prototype -> Object.prototype -> null

当我们访问对象的属性或方法时,JavaScript会沿着原型链向上查找。如果在当前对象中找不到该属性或方法,JavaScript会继续在该对象的原型对象中查找,依此类推,直到找到该属性或方法,或者到达原型链的末端(null)。

面试经典问题

在JavaScript面试中,经常会遇到一些与原型和原型链相关的问题。这些问题通常会考察候选人对JavaScript语言的理解程度。以下是一些常见的原型链相关面试问题:

  • 什么是原型?
  • 什么是原型链?
  • 如何访问对象的原型对象?
  • 如何修改对象的原型对象?
  • 什么是原型污染?
  • 如何防止原型污染?

如果您能熟练回答这些问题,那么您对JavaScript的理解就达到了一个比较高的水平。

总结

原型和原型链是JavaScript语言中非常重要的概念。理解原型和原型链的概念对于深入理解JavaScript语言至关重要。希望本文能帮助您更好地理解原型和原型链。