Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Прототипное наследование. Лохотрон. (https://javascript.ru/forum/misc/39792-prototipnoe-nasledovanie-lokhotron.html)

pikko 12.07.2013 04:31

Прототипное наследование. Лохотрон.
 
// представьте что у вас есть некий объект:
var a = {
    w : ['a', 'h', 't', ' ', 't', 'h', 'e'],
    f : [
            {  u : 'c',
                k : '?'
            }
        ]
};

// и вам надо произвести какие-то страшные манипуляции с его данными,
// при этом не повредив его, потому что, допустим, он очень дорог вам,
// и вы любите его всей душой.

// Вы делаете потомка, с которым не страшно делать все что угодно:
var b = Object.create(a);

// и делаете свои грязные делишки:
b.w.splice(0, b.w.length);
delete b.f[0].u;
delete b.f[0].k;

// вопрос — что теперь с вашим любимым 'a' ?
alert(JSON.stringify(a, null, 4));


Я понимаю что происходит и почему, но ведь это же НЕПРАВИЛЬНО! Какое же это наследование?

mta88 12.07.2013 04:50

Цитата:

Сообщение от pikko (Сообщение 261845)
Я понимаю что происходит и почему, но ведь это же НЕПРАВИЛЬНО! Какое же это наследование?

да ладно, вы не единственный, кто находил недостатки в javascript, как и в любом другом языке
в том и мастерство программиста, чтобы обходить недостатки и пользоваться достоинствами
например в данном случае можно поискать библиотеку для эмуляции "классического" наследования
ну или можно найти другой язык или вообще все бросить :)

pikko 12.07.2013 05:12

Цитата:

Сообщение от mta88 (Сообщение 261847)
библиотеку для эмуляции "классического" наследования

сколько библиотек ни подключи, а в JavaScript нет другого наследования кроме прототипного. В данном случае поможет только полное копирование объекта, это несколько строчек, и нет смысла ради этого что-то подключать.

И вообще, я ж не жалуюсь, я просто предупредить, может кто не знает. Такое поведение совсем не интуитивно, и я долго искал где ошбся, прежде чем понял, что ошибся, вроде как, и не я =)

danik.js 12.07.2013 09:21

Так это не бага, а фича!
Если фича не нужна, юзаем Object.freeze()

nerv_ 12.07.2013 11:46

Цитата:

Сообщение от danik.js
Так это не бага, а фича!

вообще то, да. Кроме того, ежу ясно, что объекты передаются по ссылке, это нормально. Делайте копию объекта и будет вам счастье :) или делайте методы для работы с этим объектом.


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