📅  最后修改于: 2023-12-03 15:29:14.541000             🧑  作者: Mango
Javascript是一种基于原型的面向对象编程语言。在Javascript中,每个对象都有一个原型对象 (prototype),它充当着对象的模板,提供了一组可被继承的属性和方法。
在Javascript中,一个对象可以通过原型链 (prototypical chain) 来访问其原型对象。当你访问一个对象的属性或方法时,Javascript会首先检查该对象本身是否包含该属性或方法。如果不包含,它将向其原型对象查找,并继续向上查找,直到找到或查找完整个原型链。
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log(`Hello, my name is ${this.name}`);
};
var p1 = new Person('John');
p1.sayHello(); // Hello, my name is John
var p2 = new Person('Jane');
p2.sayHello(); // Hello, my name is Jane
在上面的代码中,我们创建了一个名为 Person
的构造函数,并设置了 sayHello
方法。我们还在 Person.prototype
对象上设置了 sayHello
方法。当我们创建了 p1
和 p2
两个实例后,它们都可以访问 sayHello
方法,因为它们的原型对象都是 Person.prototype
,而且它们都继承了 sayHello
方法。
通过原型链,Javascript 还可以实现继承。一个对象可以通过设置其原型对象为另一个对象来实现继承。
function Person(name) {
this.name = name;
}
Person.prototype.sayHello = function() {
console.log(`Hello, my name is ${this.name}`);
};
function Student(name, grade) {
Person.call(this, name);
this.grade = grade;
}
Student.prototype = Object.create(Person.prototype);
Student.prototype.constructor = Student;
Student.prototype.sayGrade = function() {
console.log(`I am in grade ${this.grade}`);
};
var s1 = new Student('John', 5);
s1.sayHello(); // Hello, my name is John
s1.sayGrade(); // I am in grade 5
在上面的代码中,我们创建了一个名为 Student
的构造函数来继承 Person
。我们在 Student.prototype
对象上设置一个新的 sayGrade
方法,该方法打印学生的年级。我们通过 Object.create
方法将 Student.prototype
的原型对象设置为 Person.prototype
,以实现继承。我们也重置了 Student.prototype.constructor
属性,以使其指向正确的构造函数。
现在,我们可以使用 Student
构造函数创建一个新的学生对象 s1
,它可以访问 sayHello
和 sayGrade
方法,因为它们都继承自 Person
原型对象。
在Javascript中,原型机制使得对象之间的关系更加灵活,可以实现继承和多态等面向对象的特性。了解原型机制可以更好地理解Javascript的内部实现和语言特性。