返回

不再赘述js继承, 说一下js继承中的隐式原型链

前端

前言

在JavaScript中,继承是一种通过原型链来实现的机制。原型链是一个对象到另一个对象的引用链,它允许一个对象访问另一个对象的属性和方法。JavaScript中的每个对象都有一个原型对象,该对象是一个普通的JavaScript对象,它包含了一些属性和方法,这些属性和方法可以被该对象的所有实例访问。

隐式原型链

JavaScript中的隐式原型链是指当一个对象被创建时,它会自动获得一个原型对象。这个原型对象是该对象的构造函数的prototype属性。因此,我们可以通过构造函数的prototype属性来访问该构造函数所有实例的共享属性和方法。

例如,以下代码创建了一个名为Person的构造函数:

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

这个构造函数有一个名为name的属性,它保存了该人的姓名。当我们使用new创建一个Person对象时,该对象会自动获得一个原型对象,该原型对象是Person.prototype。Person.prototype对象包含了一些属性和方法,这些属性和方法可以被所有Person对象访问。

例如,以下代码创建一个名为person的Person对象:

var person = new Person("John Doe");

person对象具有一个名为name的属性,该属性保存了该人的姓名。person对象还具有一个名为sayHello()的方法,该方法可以打印出该人的姓名。

person.sayHello(); // 输出:John Doe

sayHello()方法是Person.prototype对象的一个属性,因此它可以被所有Person对象访问。

使用隐式原型链实现继承

我们可以通过隐式原型链来实现继承。为了实现继承,我们需要将子构造函数的原型对象设置为父构造函数的prototype属性。这样,子构造函数的实例就可以访问父构造函数的原型对象的所有属性和方法。

例如,以下代码创建了一个名为Student的构造函数,Student构造函数继承了Person构造函数:

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

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

Student构造函数有一个名为name的属性,它保存了该学生的姓名。Student构造函数还有一个名为major的属性,它保存了该学生的专业。Student构造函数的prototype对象是Person.prototype的一个副本,因此Student对象可以访问Person.prototype对象的所有属性和方法。

例如,以下代码创建一个名为student的Student对象:

var student = new Student("John Doe", "Computer Science");

student对象具有一个名为name的属性,该属性保存了该学生的姓名。student对象还具有一个名为major的属性,该属性保存了该学生的专业。student对象还具有一个名为sayHello()的方法,该方法可以打印出该学生的姓名。

student.sayHello(); // 输出:John Doe

sayHello()方法是Person.prototype对象的一个属性,因此它可以被所有Person对象访问。

总结

JavaScript中的隐式原型链是一种强大的机制,它可以用来实现继承。通过隐式原型链,我们可以将子构造函数的原型对象设置为父构造函数的prototype属性,这样子构造函数的实例就可以访问父构造函数的原型对象的所有属性和方法。