返回

揭秘原型与原型链:编程世界中的奥秘

前端

原型和原型链是面向对象编程中两个基本且重要的概念,它们为理解对象的行为和继承机制提供了基础。在JavaScript中,每个对象都有一个原型,原型又指向另一个对象,以此类推,形成一条原型链。

原型

原型(prototype)是一个特殊的对象,它存储着对象的共享属性和方法。当创建新对象时,JavaScript会将该对象的新属性和方法添加到它的原型中,使得所有属于该原型的对象都可以访问这些属性和方法。例如:

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

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

const person1 = new Person('John', 25);
const person2 = new Person('Mary', 30);

person1.greet(); // Hello, my name is John and I am 25 years old.
person2.greet(); // Hello, my name is Mary and I am 30 years old.

在这个例子中,Person.prototype是一个对象,它包含了一个greet()方法。当创建person1person2这两个对象时,它们都继承了Person.prototype中的greet()方法。

原型链

原型链(prototype chain)是一条从对象到它的原型再到它的原型的原型的...的链条,它允许对象访问其原型中的属性和方法。当我们访问对象的属性或方法时,JavaScript会沿着原型链向上查找,直到找到该属性或方法为止。例如:

console.log(person1.name); // John
console.log(person1.age); // 25
console.log(person1.greet()); // Hello, my name is John and I am 25 years old.

当我们访问person1.name属性时,JavaScript会沿着原型链向上查找,直到找到Person.prototype中的name属性。同样地,当我们访问person1.age属性时,JavaScript会沿着原型链向上查找,直到找到Person.prototype中的age属性。当我们调用person1.greet()方法时,JavaScript会沿着原型链向上查找,直到找到Person.prototype中的greet()方法。

原型继承

原型继承是JavaScript中实现继承的一种方式。当创建子类时,子类的原型会被设置为父类的原型,这使得子类可以继承父类中的所有属性和方法。例如:

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

Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;

const student1 = new Student('John', 25, 'Computer Science');

console.log(student1.name); // John
console.log(student1.age); // 25
console.log(student1.major); // Computer Science
console.log(student1.greet()); // Hello, my name is John and I am 25 years old.

在这个例子中,Student类继承了Person类,因此Student类的原型指向Person类的原型。这使得Student类可以继承Person类中的所有属性和方法。

原型污染

原型污染是指通过修改原型对象来影响所有属于该原型的对象的行为。例如:

Person.prototype.hack = function() {
  console.log('I am a hacker!');
};

person1.hack(); // I am a hacker!
person2.hack(); // I am a hacker!

在这个例子中,我们修改了Person.prototype对象,添加了一个hack()方法。这使得所有属于Person原型的对象都可以访问这个hack()方法,包括person1person2

原型污染是一个安全问题,因为它允许攻击者修改对象的原型对象,从而影响所有属于该原型的对象的行为。

总结

原型和原型链是JavaScript中两个重要且基本的概念,它们为理解对象的行为和继承机制提供了基础。掌握它们对于理解面向对象编程至关重要。