На самом деле, Javascript не копирует ничего из прототипа.Все, что вы определяете в прототипе, существует только один раз (в самом прототипе) и используется повторно, поскольку один и тот же экземпляр прототипа передается всем объектам.
Когда вы обращаетесь к свойству объекта, объект проверяет, неэто определяется само по себе.Если это так, он вернет значение, связанное с этим свойством.Если это не так, он делегирует вызов своему прототипу, который отныне будет нести ответственность за то, что происходит.Вот почему «наследование» (повторное использование кода) в Javascript лучше называть делегированием.
В доступе для записи все немного иначе.Если вы установите свойство для объекта, оно будет «скрывать» значение локально.По этой причине свойство str не изменяется, оно фактически определено в объекте inst2.Но если вы delete inst2.str
и сделаете еще один console.log( inst2.str )
, вы заметите, что он вернет старое значение.
PS: Если вы хотите, чтобы предотвратить это, взгляните на этот учебник: http://kevlindev.com/tutorials/javascript/inheritance/index.htm
Я рекомендую прочитать все это, но если вы просто хотите мясо, посмотрите функцию KevLinDev.extend в разделе «Создание подкласса».