console.log объект/класс javascript - тот же результат до и после изменения прототипа

Я пытаюсь понять, как работают js prototypes и classes, и я использую Chrome console.log для печати и просмотра состояния моих объектов, пока я добавляю новые свойства и т. д.

Это код, который я использую: (fiddle)

function Person(){}

Person.prototype.sayHello = function(){ alert("Hello"); };
Person.prototype.name = "Name";

console.log(Person.prototype) //1st console.log

Person.prototype.surname = "Surname";

console.log(Person.prototype); //2nd console.log

Я ожидаю, что в консоли будут напечатаны два разных результата, потому что свойство surname было добавлено после первого журнала консоли. Вместо этого это вывод консоли:

введите здесь описание изображения

Как видите, оба выхода имеют определенное свойство surname, даже если оно было добавлено только после 1-го console.log..

Можете ли вы объяснить мне, почему? Что мне не хватает? Разве console.log не показывает текущее состояние объекта при вызове?

Заранее спасибо, с уважением


person BeNdErR    schedule 03.03.2014    source источник


Ответы (1)


ваша следующая строка кода, где вы устанавливаете фамилию человека, не ждет консольного журнала, потому что console.log асинхронный, когда вы попробуете этот код с тайм-аутом, он будет правильным,

 function Person() {}

 Person.prototype.sayHello = function () {
     alert("Hello");
 };
 Person.prototype.name = "Name";

 console.log(Person.prototype) //1st console.log
 setTimeout(function(){
  Person.prototype.surname = "Surname";

 console.log(Person.prototype); //2nd console.log
 },1000);

вы можете сохранить копию этого объекта, прежде чем регистрировать его, тогда он будет работать

Синхронное ведение журнала консоли в Chrome

ОБНОВЛЕНИЕ: у меня есть еще лучшее решение:
просто зарегистрируйте строковую версию объекта, и все будет в порядке.

console.log(JSON.stringify(Person.prototype))
person john Smith    schedule 03.03.2014
comment
взгляните на эту эту скрипку: если вы ждете оба console.log, прежде чем открывать объект иерархия, hte surname присутствует в обоих .. если вы открываете 1-й объект во время ожидания 2-го журнала, surname не отображается .. почему :O? - person BeNdErR; 03.03.2014
comment
хмн для меня фамилия присутствует только во втором журнале на последнем хроме на mac osx - person john Smith; 03.03.2014
comment
также если вы ждете появления второго журнала, а затем (и только тогда) вы открываете объект Person? - person BeNdErR; 03.03.2014
comment
как я уже сказал, вы можете просто скопировать объект и зарегистрировать скопированный экземпляр, но да, это странно :D - person john Smith; 03.03.2014
comment
ваша следующая строка кода, в которой вы устанавливаете фамилию человека, не ожидает консольного журнала, потому что console.log асинхронный Нет, console.log не асинхронный. Но консоль хранит живую ссылку на объект, и расширение объекта в консоли происходит асинхронно. Иногда. В зависимости от того, была ли консоль открыта при входе, среди прочего. - person T.J. Crowder; 14.09.2015