Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.03.2013, 01:45
Интересующийся
Отправить личное сообщение для Seran4ek Посмотреть профиль Найти все сообщения от Seran4ek
 
Регистрация: 04.06.2010
Сообщений: 18

помогите разобраться с прототипами
с системой наследования на протитах я знаком и как она работает в ОБЩЕМ представляю.
но недавно решил углубиться и немного запутался.
собственно смутило меня вот что.

function Rabbit() { }
Rabbit.prototype = { eats: true };
var rabbit = new Rabbit();


в таком случае при создании объекта rabbit в его свойство __proto__ будет записана ССЫЛКА на свойство prototype конструктора(Rabbit).
Но почему в этом случае

function Rabbit() { }
Rabbit.prototype = { eats: true };
var rabbit = new Rabbit();
Rabbit.prototype = {};
alert(rabbit.eats);

результат TRUE, а в этом

function Rabbit(name) { }
Rabbit.prototype = { eats: true }
var rabbit = new Rabbit();
Rabbit.prototype.eats = false;
alert(rabbit.eats);

FALSE. я никак не могу понять.

ведь и в первом и во втором случае мы изменили Rabbit.prototype
Ответить с цитированием
  #2 (permalink)  
Старый 07.03.2013, 04:59
Аватар для danik.js
Профессор
Отправить личное сообщение для danik.js Посмотреть профиль Найти все сообщения от danik.js
 
Регистрация: 11.09.2010
Сообщений: 8,804

Прототипы не причем.

var obj1 = {prop: true};
obj2 = obj1;
alert(obj2.prop);

obj1 = {prop: false};
alert(obj2.prop);


Помоему все логично. Переменные хранят ссылку на объект, а не на другую переменную. Если сделать так, чтобы одна переменная ссылалась на другой объект(новый), то вторую переменную это не коснется - она попрежнему будет ссылаться на первый объект.

var obj1 = {prop: true};
obj2 = obj1; // сейчас obj2 ссылается не на obj1, а на объект, на который ссылается obj1!!!
alert(obj2.prop);

obj1 = {prop: false}; // теперь obj1 ссылается на новый объект. obj2 попрежнему ссылается на старый объект.
alert(obj2.prop);
Ответить с цитированием
  #3 (permalink)  
Старый 07.03.2013, 09:40
Аватар для eirnvn
Кандидат Javascript-наук
Отправить личное сообщение для eirnvn Посмотреть профиль Найти все сообщения от eirnvn
 
Регистрация: 15.09.2011
Сообщений: 70

В учебнике очень хорошо объясняется эта тема:
В первом случае :
Rabbit.prototype = { eats: true };
var rabbit = new Rabbit();

rabbit получает прототипом объект { eats: true }, затем у функции вы поменяли прототип на - {}, а у rabbit остается { eats: true }.

А во втором случае вы меняете САМ прототип (доступ получили к нему через функцию), вы его сделали Rabbit.prototype.eats = false; - { eats: false }

Вот так.
__________________
"I don't write to say what I think, but to know what I think"

Последний раз редактировалось eirnvn, 07.03.2013 в 09:43. Причина: непонятно
Ответить с цитированием
  #4 (permalink)  
Старый 07.03.2013, 16:59
Интересующийся
Отправить личное сообщение для Seran4ek Посмотреть профиль Найти все сообщения от Seran4ek
 
Регистрация: 04.06.2010
Сообщений: 18

danik.js,
ох некислый я пробел нашел в знаниях, пошел изучать, спасибо большое
Ответить с цитированием
  #5 (permalink)  
Старый 11.03.2013, 17:22
Интересующийся
Отправить личное сообщение для Seran4ek Посмотреть профиль Найти все сообщения от Seran4ek
 
Регистрация: 04.06.2010
Сообщений: 18

посмотрел в книгу фленагана, там как раз есть глава об элементарных и ссылочных типах.

и вот такой пример

var a = [1,2,3];
var b = a;
a[0] = 99;
alert(b);


и тут, емае, выводится измененный вариант в обоих случаях(чего и следовало ожидать, ибо обе переменные ссылаются на тот же массив).

я запутался

Последний раз редактировалось Seran4ek, 11.03.2013 в 20:07.
Ответить с цитированием
  #6 (permalink)  
Старый 11.03.2013, 17:31
Аватар для rgl
rgl rgl вне форума
Профессор
Отправить личное сообщение для rgl Посмотреть профиль Найти все сообщения от rgl
 
Регистрация: 28.02.2011
Сообщений: 349

Нужно очень четко понимать различие, либо вы меняете что-то в объекте (как в вашем примере, меняете нулевой элемент массива), либо вы заменяете объект на другой.
var a = [1,2,3];
var b = a;
a = [99,2,3];
alert(b);
Ответить с цитированием
Ответ


Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Получение ответа сервера через iframe и xhr. Помогите разобраться. Arconas AJAX и COMET 0 26.02.2013 10:38
Помогите разобраться с this Nigga2102 Элементы интерфейса 4 04.05.2011 18:28
Прелоадер (помогите разобраться) xsfd AJAX и COMET 6 16.09.2010 02:30
Помогите пожалуйста разобраться Kupu4 Ваши сайты и скрипты 0 21.01.2010 10:44
Помогите разобраться с галереей IMAGIN yana_studio Общие вопросы Javascript 4 12.12.2009 17:24