В чем различие этих 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) // тоже кот