返回

深入理解Javascript中的原型与__proto__,掌握原型链查找机制

前端

在JavaScript中,原型和__proto__是两个密切相关的概念,它们共同构成了原型链查找机制。理解原型和__proto__对于深入掌握JavaScript中的对象和继承机制至关重要。

原型

每个JavaScript对象都有一个原型,原型是一个对象,它包含了该对象的所有属性和方法。当我们使用new创建对象时,JavaScript引擎会自动创建一个新的对象,并将该对象的原型设置为构造函数的prototype属性。例如:

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

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

此时,person1对象有一个原型,原型是Person函数的prototype属性。我们可以使用__proto__属性来访问对象的原型。

console.log(person1.__proto__ === Person.prototype); // true

proto

__proto__属性是对象的一个属性,它指向该对象的原型。我们可以使用__proto__属性来访问对象的原型。例如:

const person2 = {};
person2.__proto__ = Person.prototype;

console.log(person2.__proto__ === Person.prototype); // true

此时,person2对象有一个原型,原型是Person函数的prototype属性。我们可以使用__proto__属性来访问对象的原型。

原型链查找机制

当我们访问对象的属性或方法时,JavaScript引擎会沿着原型链向上查找,直到找到该属性或方法。例如:

person1.name; // "John"

当我们访问person1.name属性时,JavaScript引擎会首先在person1对象中查找name属性,如果没有找到,则会沿着原型链向上查找,直到找到该属性。在Person函数的prototype属性中,找到了name属性,因此返回"John"。

原型链查找机制使得JavaScript中的对象可以继承自其他对象。例如,我们可以定义一个Student类,Student类继承自Person类。

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

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

const student1 = new Student('Mary', 20, 'MIT');

此时,student1对象有一个原型,原型是Student函数的prototype属性。Student函数的prototype属性继承自Person函数的prototype属性,因此student1对象可以访问Person类中的所有属性和方法。

理解原型和__proto__对于深入掌握JavaScript中的对象和继承机制至关重要。通过熟练掌握原型链查找机制,我们可以写出更优雅、高效的代码。