'Why is it necessary to call both the prototype and constructor here

What exactly is the 'constructor' in the following? That is, what does the Object.create do vs. calling the constructor? Does the constructor actually execute the function name, or what magic happens there?

function greet(name) {
    this.print = function print() {console.log('hey!', name)};
}

// why's it required to create an object of the funcion.prototype and again initialize the constructor?
let y = Object.create(greet.prototype);
y.constructor('Bob');
y.print();

// this part makes sense to me.
let z = new greet('Bob');
z.print();

Also, if I were to put the print() method outside the function, how would I access the name? For example:

function greet(name) {
    this.name = name;
}
greet.prototype.print = () => {console.log('hey!', this.name)};
// 'hey! undefined'


Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source