используя функцию расширения

это мой самый первый пост! У меня есть небольшой вопрос относительно наследования в javascript.

Конечно, метод «extend2» используется для наследования дочерних объектов от родительского объекта с использованием цикла for-in.

var extend2 = function (child, parent) {
    var c = child.prototype;
    var p = parent.prototype;
    for (var i in p) {
        c[i] = p[i];
    }
}

В настоящее время я читаю «Объектно-ориентированный Javascript» Стояна Стефанова. Это потрясающая книга.

Может ли кто-нибудь дать мне хорошее подробное объяснение того, как дочерний объект-прототип не полностью перезаписывается или заменяется, а просто дополняется?

Как получается, что при наследовании объекты копируют (примитивные типы данных) вместо того, чтобы искать их как ссылку с помощью функции extend2?

Это действительно поможет спасибо!


person user1120327    schedule 18.01.2012    source источник
comment
Ваш extend2 не работает Стоянами. Он перебирает родительский прототип и копирует (sic) все свойства в дочерний прототип. Пока вы перебираете родительский прототип, вы пытаетесь получить доступ и скопировать свойства из/в сами объекты, а не их прототипы.   -  person bennedich    schedule 18.01.2012
comment
Моя ошибка, Беннедич, я повторно редактирую свой код.   -  person user1120327    schedule 18.01.2012


Ответы (1)


Примитивные типы данных в javascript передаются через значение, а не по ссылке. Таким образом, когда вы копируете значение, оно фактически копирует его, а не ссылается на него. Традиционно это связано с тем, что примитив был буквально закодирован в памяти таким образом (таким образом, примитив int 7 будет закодирован в памяти как 0x7. Однако при работе с объектами они кодируются как указатель на место в памяти, где фактически Таким образом, когда вы копируете значение, это просто копия указателя ссылки, а не объекта, на который ссылается этот указатель.

Что касается того факта, что дочерний прототип не заменяется, то это потому, что прототип в java - это просто еще один объект. Таким образом, прототип может выглядеть так:

{
    someField: 5
}

Это указывало бы на то, что экземпляры объекта будут инициализироваться полем с именем someField, значение которого равно 5. с приведенным выше кодом каждая запись в объекте копируется в дочерний прототип, но ничего не удаляется. Таким образом, если дочерний прототип выглядит так:

{
    someField: 10
    someOtherField: 3
}

Затем выполнение приведенной выше команды extend2 перезапишет someField, но не someOtherField, поэтому результирующий прототип будет таким:

{
    someField: 5
    someOtherField: 3
}
person Jeff    schedule 18.01.2012