Почему мы можем сначала исправить свойство конструктора, а затем сбросить прототип? - PullRequest
0 голосов
/ 25 февраля 2019

Это нормально, что мы сбрасываем прототип для достижения наследования. И затем мы фиксируем свойство конструктора. Но почему мы могли бы сначала исправить свойство конструктора, а затем сбросить прототип?

way1:

function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    o1.constructor = subType;
    subType.prototype = o1;
}

way2:

function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype); 
    subType.prototype = o1;
    o1.constructor = subType;
}

Когда я console.log(o1.constructor), я обнаружил, что way1 и way2 могут изменить o1.cobstructor.Я могу понять way2, как это исправить конструктор после сброса прототипа (нормальный).Но как насчет way2?Я не могу понять, что way2 по-прежнему работает, поскольку порядок o1.constructor = subType и subType.prototype = o1; неправильный.

PS: Сброс прототипа выглядит так: subType. prototype= superType Так как он меняет какой подтип.Прототип указывает на, нам нужно исправить конструктор

Исправление конструктора выглядит так: subType. prototype.constructor= subType Это заставляет subType. prototype.constructor снова указывать на подтип.

1 Ответ

0 голосов
/ 26 февраля 2019

В своем последнем абзаце вы сказали, что выражение «исправление конструктора» было subType.prototype.constructor = subType;, но это не то, что в примерах кода.В ваших примерах кода это o1.constructor = subType.Если бы это был первый, то порядок имел бы значение, и работал бы только way2.

Вместо этого он использует o1.constructor = subType.Порядок не имеет значения, потому что o1 не изменяется оператором subType.prototype = o1;, поэтому он не может влиять на действия o1.constructor = subType.

Все эти три версии работают:

function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    subType.prototype = o1;
    o1.constructor = subType;
}
function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    o1.constructor = subType;
    subType.prototype = o1;
}
function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    subType.prototype = o1;
    subType.prototype.constructor = subType;
}

Но это не так, поскольку он устанавливает свойство конструктора для старого значения subType.prototype вместо o1:

function inheritPrototype(subType,superType){
    var o1 = Object.create(superType.prototype);
    subType.prototype.constructor = subType;
    subType.prototype = o1;
}
...