The first part is pretty common, it's just a way to get the constructor of the subtype to share the functionality of the supertype's constructor. Notice that
Person.call doesn't invoke
Person as a constructor here, it invokes it as a regular function using the
this binding from the
Student being constructed.
It's probably a bit more common to see it written like this:
If you don't like the idea of writing the name of the parent constructor explicitly and are looking for something generic like "super" you could do this instead:
You don't usually see this, though, because it's pretty unwieldy and you probably already have a reference to the parent constructor at the point where you're doing this anyway.
The second part is widely regarded as being incorrect. Don't do this:
Student.prototype = new Person();
Do this instead.
Student.prototype = Object.create(Person.prototype);
Object.create(Person.prototype) gives you an object with
Person.prototype in its prototype chain without executing the
Person constructor (which could have side effects and is unnecessary).