используя функцию расширения - PullRequest
0 голосов
/ 18 января 2012

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

Конечно, метод extended2 используется для наследования дочерних объектов от родительского объекта с помощью цикла for.

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

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

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

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

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

1 Ответ

0 голосов
/ 18 января 2012

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

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

{
    someField: 5
}

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

{
    someField: 10
    someOtherField: 3
}

Тогда выполнение вышеуказанной команды extend2 перезапишет someField, но не someOtherField, поэтому полученный прототип будет:

{
    someField: 5
    someOtherField: 3
}
...