javascript原型链详解
2024-01-10 01:31:49
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中的对象可以以一种非常灵活的方式进行组合和扩展。