помогите разобраться с прототипами
с системой наследования на протитах я знаком и как она работает в ОБЩЕМ представляю.
но недавно решил углубиться и немного запутался. собственно смутило меня вот что.
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 :-? |
Прототипы не причем.
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);
|
В учебнике очень хорошо объясняется эта тема:
В первом случае :
Rabbit.prototype = { eats: true };
var rabbit = new Rabbit();
rabbit получает прототипом объект { eats: true }, затем у функции вы поменяли прототип на - {}, а у rabbit остается { eats: true }. А во втором случае вы меняете САМ прототип (доступ получили к нему через функцию), вы его сделали Rabbit.prototype.eats = false; - { eats: false } Вот так. |
danik.js,
ох некислый я пробел нашел в знаниях, пошел изучать, спасибо большое |
посмотрел в книгу фленагана, там как раз есть глава об элементарных и ссылочных типах.
и вот такой пример var a = [1,2,3]; var b = a; a[0] = 99; alert(b); и тут, емае, выводится измененный вариант в обоих случаях(чего и следовало ожидать, ибо обе переменные ссылаются на тот же массив). я запутался :blink: |
Нужно очень четко понимать различие, либо вы меняете что-то в объекте (как в вашем примере, меняете нулевой элемент массива), либо вы заменяете объект на другой.
var a = [1,2,3]; var b = a; a = [99,2,3]; alert(b); |
| Часовой пояс GMT +3, время: 17:50. |