返回

一文详解JavaScript原型&原型链

前端

前言

在JavaScript中,原型和原型链是一个非常重要的概念。理解了原型和原型链,我们才能更好地理解JavaScript面向对象编程的实现方式。

什么是原型

在JavaScript中,每个对象都有一个原型,原型是一个特殊的对象,它包含了该对象的所有属性和方法。当我们访问一个对象的属性或方法时,JavaScript会首先在该对象中查找,如果没有找到,则会沿着原型链向上查找,直到找到该属性或方法为止。

原型链是如何工作的

原型链是一个从子对象指向父对象的对象链。当我们访问一个对象的属性或方法时,JavaScript会首先在该对象中查找,如果没有找到,则会沿着原型链向上查找,直到找到该属性或方法为止。这个过程称为原型链查找。

原型链的查找顺序如下:

  1. 在对象自身中查找。
  2. 在对象的原型中查找。
  3. 在对象的原型的原型中查找。
  4. 以此类推,直到找到该属性或方法为止。

如果在原型链中找不到该属性或方法,则会返回undefined。

原型继承

在JavaScript中,原型继承是一种通过原型链来实现继承的方式。当一个子对象继承父对象时,子对象的原型会被设置为父对象的实例。这样,子对象就可以访问父对象的所有属性和方法。

原型继承的语法如下:

function Parent() {
  this.name = "父对象";
}

Parent.prototype.sayHello = function() {
  console.log("我是父对象,我的名字是" + this.name);
};

function Child() {
  this.name = "子对象";
}

Child.prototype = new Parent();

const child = new Child();

child.sayHello(); // 输出:我是父对象,我的名字是子对象

在上面的例子中,Child继承了Parent,所以Child对象的原型被设置为Parent对象的实例。这样,Child对象就可以访问Parent对象的所有属性和方法。

原型污染

原型污染是指修改对象的原型,从而影响所有继承该对象的子对象。原型污染可能导致安全问题,因此在使用原型继承时需要注意。

原型污染的例子如下:

function Person() {
  this.name = "张三";
}

Person.prototype.sayHello = function() {
  console.log("我是" + this.name);
};

const attacker = {
  constructor: Person,
  name: "攻击者",
  sayHello: function() {
    console.log("我是攻击者,我的名字是" + this.name);
  }
};

Person.prototype = attacker;

const victim = new Person();

victim.sayHello(); // 输出:我是攻击者,我的名字是攻击者

在上面的例子中,攻击者对象修改了Person对象的原型,从而影响了所有继承Person对象的子对象。当victim对象调用sayHello方法时,输出的是攻击者的名字,而不是自己的名字。

原型委托

原型委托是指子对象将属性和方法的查找委托给原型对象。原型委托可以提高代码的复用性,并减少内存消耗。

原型委托的例子如下:

function Person() {
  this.name = "张三";
}

Person.prototype.sayHello = function() {
  console.log("我是" + this.name);
};

function Student() {
  this.school = "清华大学";
}

Student.prototype = new Person();

const student = new Student();

student.sayHello(); // 输出:我是张三

console.log(student.school); // 输出:清华大学

在上面的例子中,Student对象委托给Person对象来查找sayHello方法,并委托给Person对象的原型来查找name属性。这样,Student对象就可以访问Person对象的所有属性和方法,而无需自己实现。

结语

原型和原型链是JavaScript中非常重要的概念。理解了原型和原型链,我们才能更好地理解JavaScript面向对象编程的实现方式。

在本文中,我们学习了什么是原型,原型链是如何工作的,原型继承是什么,原型污染是什么,以及原型委托是什么。希望本文对您有所帮助。