Вы не можете установить прототип внутри функции таким образом. При вызове функции с оператором new
создается новый объект, и этому объекту устанавливается this
. У объектов нет общедоступного свойства прототипа, которое вы можете установить. Их свойство prototype на самом деле __proto__
, которое недоступно (хотя некоторые браузеры позволяют вам это сделать).
Во втором примере вы просто устанавливаете обычное ванильное свойство с именем «prototype» со значением.
свойство prototype
для функции также не является прототипом! Смущает, а? Что это на самом деле является чем-то вроде «прототипа шаблона». В основном это означает, что «когда вы создаете объект, используя эту функцию в качестве конструктора, установите для его прототипа то, что я установил в свойстве prototype
». Это может быть очень запутанным, пока вы не поймали это.
Также обратите внимание
Ваш первый пример тоже не работает ( попробуйте здесь ), вы устанавливаете свойство prototype функции после того, как экземпляр уже был создан. Так что этому экземпляру уже был присвоен другой объект-прототип. Если вы создали второй экземпляр class2
, он правильно сообщит свойству.