📜  [[原型]] - Javascript (1)

📅  最后修改于: 2023-12-03 15:29:14.541000             🧑  作者: Mango

Javascript - 原型

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 方法。当我们创建了 p1p2 两个实例后,它们都可以访问 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,它可以访问 sayHellosayGrade 方法,因为它们都继承自 Person 原型对象。

总结

在Javascript中,原型机制使得对象之间的关系更加灵活,可以实现继承和多态等面向对象的特性。了解原型机制可以更好地理解Javascript的内部实现和语言特性。