Javascript наследование цепочки областей видимости - PullRequest
3 голосов
/ 29 мая 2020

Я студент, изучающий программирование.

У меня вопрос.

function a () {

}

a.prototype.prtSomething = function(arg) { console.log(arg); }

function b () {

}

var myObj = new b();

Если я хочу использовать метод a в myObj, мы используем этот код.

b.prototype = Object.create(a.prototype);
b.prototype.constructor = b;

Это означает изменение цели объединения областей видимости. Но почему бы нам не использовать этот код?

b.prototype.__proto__ = a.prototype;

Я думаю, должна быть причина для создания и использования нового объекта. но я не знаю. Пожалуйста, научите меня. Спасибо.

1 Ответ

4 голосов
/ 29 мая 2020

Но почему бы нам не использовать этот код?

Можно, и это сработает, но:

  1. Изменение прототипа объекта обычно не является хорошей идеей, и может заставить JavaScript движки не оптимизировать этот объект.

  2. __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 именованию (функции конструктора начинаются с заглавная буква).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...