В чем отличие __proto__ от prototype?

1,00
р.
В чем различие этих 2 способов прототипного наследования и какой из них более правильнее использовать?


function Cat() {
this.__proto__.type = 'кот'
}


var cat = new Cat()
console.log(cat.type) // кот


function CatTwo() {
}
CatTwo.prototype.type = 'тоже кот'

var catTwo = new Cat()
console.log(catTwo.type) // тоже кот


Ответ
На самом деле в примере в вопросе нет наследования.

__proto__ до недавнего времени не был стандартизирован.
В последних спецификациях можно найти, что getter __proto__, обертка над вызовом внутренней функции [[GetPrototypeOf]].
Точно такая же, как и функция Object.getPrototypeOf

Если применительно к приведенному коду:
в первом случае значение прототипа меняется каждый раз при создании объекта, во втором - устанавливается всего один раз.
Отсюда можно сделать вывод, что если есть доступ к конструктору, прототип лучше менять непосредственное у него.

Пример, когда приведенный код выдаст разные значения:


function Cat(type) {
this.__proto__.type = type
}

var cat = new Cat('кот')
console.log(cat.type) // кот
var cat2 = new Cat('кот2')
console.log(cat.type) // кот2
console.log(cat2.type) // кот2


function CatTwo() {}
CatTwo.prototype.type = 'тоже кот'

var catTwo = new CatTwo()
console.log(catTwo.type) // тоже кот