Но почему бы нам не использовать этот код?
Можно, и это сработает, но:
Изменение прототипа объекта обычно не является хорошей идеей, и может заставить JavaScript движки не оптимизировать этот объект.
__proto__
раньше быть нестандартным (и по-прежнему находится за пределами веб-браузеров), и до ES2015 не было стандартного способа изменить прототип объекта. ES2015 добавил Object.setPrototypeOf
(и добавил __proto__
в свое веб-приложение B).
Таким образом, вместо того, чтобы изменять прототип b.prototype
, обычно мы заменяли его .
(я говорю «привык», потому что я бы не стал писать этот код в современном JavaScript, я бы использовал синтаксис class
, если бы мне нужна была иерархия наследования функций конструктора.)
Примечание: Не используйте __proto__
. Он предназначен исключительно для обратной совместимости со старым кодом, не указан для JavaScript вне браузеров и отсутствует для объектов, которые не наследуются от Object.prototype
. (Например, если вы сделаете const x = Object.create(null);
, тогда "__proto__" in x
будет false
и присвоение x.__proto__
не изменит его прототип.)
Вместо этого, если у вас есть причина изменить прототип объекта используйте Object.setPrototypeOf
:
function A() {
}
A.prototype.prtSomething = function(arg) {
console.log(arg);
};
function B() {
}
Object.setPrototypeOf(B.prototype, A.prototype);
const myObj = new B();
myObj.prtSomething("x");
Также обратите внимание, что я изменил a
на A
и b
на B
, чтобы соответствовать стандартному JavaScript именованию (функции конструктора начинаются с заглавная буква).