深入理解Javascript中的原型与__proto__,掌握原型链查找机制
2023-11-19 04:25:00
在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中的对象和继承机制至关重要。通过熟练掌握原型链查找机制,我们可以写出更优雅、高效的代码。