помогите разобраться с прототипами
с системой наследования на протитах я знаком и как она работает в ОБЩЕМ представляю.
но недавно решил углубиться и немного запутался. собственно смутило меня вот что. 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, время: 13:33. |