返回

javascript原型链详解

前端

javascript原型链概述

javascript原型链是javascript语言中一种独特的机制,它允许对象继承其他对象的属性和方法。这使得javascript中的对象可以以一种非常灵活的方式进行组合和扩展。

在javascript中,每个对象都有一个原型对象。原型对象是一个特殊的对象,它包含了一组属性和方法,这些属性和方法可以被该对象及其所有子对象访问和使用。

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

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

Person构造函数有一个名为name的参数,它被用来初始化对象的name属性。

现在,我们可以使用Person构造函数来创建一个新的对象:

const person = new Person('John Doe');

这个新的对象有一个name属性,它的值是John Doe

我们可以使用点运算符来访问对象的属性:

console.log(person.name); // John Doe

我们也可以使用方括号运算符来访问对象的属性:

console.log(person['name']); // John Doe

原型链上的属性查找

当我们访问对象的属性时,javascript引擎会首先在该对象中查找该属性。如果该属性在该对象中不存在,那么javascript引擎会沿着原型链向上查找,直到找到该属性。

例如,以下代码定义了一个名为Student的构造函数,它继承自Person构造函数:

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

Student构造函数有一个名为major的参数,它被用来初始化对象的major属性。

现在,我们可以使用Student构造函数来创建一个新的对象:

const student = new Student('John Doe', 'Computer Science');

这个新的对象有一个name属性和一个major属性。

我们可以使用点运算符来访问对象的属性:

console.log(student.name); // John Doe
console.log(student.major); // Computer Science

如果我们尝试访问一个不存在于该对象中的属性,那么javascript引擎会沿着原型链向上查找,直到找到该属性。

例如,以下代码尝试访问对象的age属性:

console.log(student.age); // undefined

由于对象的age属性不存在,因此javascript引擎会沿着原型链向上查找,直到找到该属性。由于Person构造函数也没有age属性,因此javascript引擎会返回undefined

原型链上的方法查找

javascript中的方法也是沿着原型链进行查找的。这意味着我们可以向对象的原型对象中添加方法,然后这些方法就可以被该对象及其所有子对象使用。

例如,以下代码向Person构造函数的原型对象中添加了一个名为greet的方法:

Person.prototype.greet = function() {
  console.log(`Hello, my name is ${this.name}.`);
};

现在,我们可以使用greet方法来向对象问好:

student.greet(); // Hello, my name is John Doe.

由于greet方法不存在于Student构造函数中,因此javascript引擎会沿着原型链向上查找,直到找到该方法。由于Person构造函数的原型对象中有greet方法,因此javascript引擎会使用该方法来向对象问好。

总结

javascript原型链是一种非常强大的机制,它允许对象继承其他对象的属性和方法。这使得javascript中的对象可以以一种非常灵活的方式进行组合和扩展。