Javascript Цепочка прототипов меняет цель - PullRequest
0 голосов
/ 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 Ответ

1 голос
/ 29 мая 2020

По крайней мере по одной уважительной причине: функция __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();
...