По крайней мере по одной уважительной причине: функция __proto__
устарела, поэтому вы не должны использовать ее для будущей совместимости.
Я рекомендую прочитать страницу MDN в топе c, а также связанные страницы о наследовании, если вы учитесь.
ПОЛЕЗНОЕ ДОПОЛНИТЕЛЬНОЕ ПРИМЕЧАНИЕ: использование b.prototype = Object.create(a.prototype);
- это способ имитировать наследование классов способом прототипа (b наследуется от a) без «родителя» (а) вызываемый конструктор. Если вы предпочитаете моделировать наследование с вызываемым "родительским" конструктором, вы можете использовать b.prototype = new a();
Конечно, это имитация поведения класса, она отличается в деталях, потому что прототипы не являются классами, например вы может динамически добавлять функции к прототипу a
после того, как был создан экземпляр b
, и новая функция будет доступна для этого экземпляра, потому что он работает по ссылке. Аналогичным образом во втором примере конструктор a
выполняется не для каждого последующего экземпляра, а только один раз, когда вы назначаете его прототипу b
.
На самом деле я считаю, что прототипы действительно эффективны, когда вы познакомитесь с ними, позволяет множество комбинаций.
function a () {
console.log('a constructor');
}
a.prototype.prtSomething = function(arg) { console.log(arg); }
function b () {
console.log('b constructor');
}
b.prototype = Object.create(a.prototype);
b.prototype.constructor = b;
var myObj = new b();
function a () {
console.log('a constructor');
}
a.prototype.prtSomething = function(arg) { console.log(arg); }
function b () {
console.log('b constructor');
}
b.prototype = new a();
b.prototype.constructor = b;
var myObj = new b();