Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Наследование. ПОчему так? (https://javascript.ru/forum/misc/37099-nasledovanie-pochemu-tak.html)

Akalenik 07.04.2013 23:16

Наследование. ПОчему так?
 
Разбираюсь с наследованием по руководству Флэнагана. Там указывается функция создания нового объекта наследующего прототип:
function inherit(p){
    if (p==null) throw TypeError();
    if (Object.create) {
        return Object.create(p);
    }
    var t = typeof p;
    if (t !== "object" && t !== "function") throw TypeError;
    function f() {};
    f.prototype = p;
    return new f();
}


Работая с ней, к примеру, так:
var o = {};
o.x = 1;
var p = inherit(o);
p.x = 3;

я в итоге получаю вывод:
o: Object {x: 1}
p: Object {x: 3, x: 1}

Вопрос: почему свойство х дублируется, а не изменяется? Где я запутался?

Octane 07.04.2013 23:40

Что за консоль так выводит? Свойства не могут дублироваться, они находятся в разных объектах:
p.x == 3 // → true
p.__proto__.x == 1 // → true

Akalenik 07.04.2013 23:52

Консоль хрома выводит.
Цитата:

Сообщение от Octane
Свойства не могут дублироваться, они находятся в разных объектах

То есть фактически мы имеем Object {{x: 1}, x: 3}? Или как на практике различить эти два свойства x?

Octane 08.04.2013 00:37

х == 1 находится в прототипе объекта р, х == 3 свойство самого объекта р

Akalenik 08.04.2013 08:54

Я правильно понимаю что в любой текущий момент мы работаем с одним определенным свойством х: если есть свойство х самого объекта, то с ним, а иначе поднимаемся к свойству х прототипа? А вот отображение обоих свойств х одновременно - это "глюк" консоли хрома?

Octane 08.04.2013 09:15

да

danik.js 08.04.2013 09:40

Это не глюк, это фича..

megaupload 08.04.2013 12:30

Цитата:

Сообщение от Akalenik
А вот отображение обоих свойств х одновременно - это "глюк" консоли хрома?

console.dir() используешь?

Akalenik 08.04.2013 13:55

console.log().
Про консоль.дир не знал. Теперь почитаю про нее.


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