Объясните в чем разница между этими вариантами кроме кроссбраузерности? То что __proto__ - свойство экземпляра, а prototype - конструктора - понятно. Не совсем понятно зачем нужно два разных способа добраться до одного и того же объекта и в каких случаях какой нужно применять, если в конструкторе всегда можно использовать и тот и другой.
// 1
function F() {
F.prototype = { ... }
}
// 2
function F() {
this.__proto__ = {...}
}
// 3
function F() {
Object.getPrototypeOf(this) = {...}
}