Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   помогите разобраться с прототипами (https://javascript.ru/forum/misc/36197-pomogite-razobratsya-s-prototipami.html)

Seran4ek 07.03.2013 01:45

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

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 :-?

danik.js 07.03.2013 04:59

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

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);

eirnvn 07.03.2013 09:40

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

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

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

Вот так.

Seran4ek 07.03.2013 16:59

danik.js,
ох некислый я пробел нашел в знаниях, пошел изучать, спасибо большое

Seran4ek 11.03.2013 17:22

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

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

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


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

я запутался :blink:

rgl 11.03.2013 17:31

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


Часовой пояс GMT +3, время: 13:33.