Как стать автором
Обновить

Комментарии 8

При создании объекта содержимое прототипа переносится на объект.
Не переносятся, а достижимы из объекта по prototype chain. В JS даже есть функция hasOwnProperty на объекте, которая проверяет наличие свойства без protochain.

Но при этом фактически копируются только скалярные свойства (числа, строки).
Все объекты в JS передаются по ссылке, просто некоторые из них immutable.
т.е. прототип — он вообще, полностью, отдельно от объекта, но есть некий «прозрачный прокси», который отдает мне св-во из прототипа если оно не существует в объекте?
Ага. Более того, в прототип можно добавить свойство ПОСЛЕ создания объекта и это свойство волшебным образом появится в самом объекте.
кстати, да, это я знаю. Не раз использовал в ExtJS. Там для модификации прототипа есть спец метод Ext.override
Ну в общем это и имелось ввиду. Передаются ссылки, которые копируются. Главное что объекты не копируются.

  1.  
  2. var a = new Object();
  3. a.x = 1;
  4. var bc = function() {};
  5. bc.prototype = a;
  6. var b = new bc();
  7. b.x++; // b.x = b.x + 1;
  8. alert(a.x); // 1
  9. alert(b.x); // 2
  10. delete b.x;
  11. alert(b.x); // 1
  12.  
Убеждаемся, что в 7 строчке у нас скрывается значение из прототипа собственным значением из объекта, однако в прототипе значение остается старым.

PS. Приведите пример необъекта (если только number, но это все условности ;-) ).
>> PS. Приведите пример необъекта (если только number, но это все условности ;-) ).

Нет, не условности. 12, «abc», true, false — это всё примитивные значения, а не объекты. При попытке вызвать у них метод, они приводятся к объекту.

var a = 'abc';
a.foo = 'bar'; // Здесь a приводится к объекту
alert(a.foo);  // undefined, если бы строки были объектами, 
               // то было бы bar


И действительно. Теперь буду больше знать о JS.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации