Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Прототипы. Хочу понять (https://javascript.ru/forum/misc/35947-prototipy-khochu-ponyat.html)

Василий Б. 27.02.2013 13:28

Прототипы. Хочу понять
 
Решил создать новую тему.
Доки читал, но понять пока не могу.
Вопросы все в коде.

Base = function(){};
Parent = function(){};
Parent.prototype = Base;

var p = new Parent();

// Добавляем к Base метод и метод в прототип.
Base.func_as_prop = function(){};
Base.prototype.func_in_proto = function(){};

console.log('Testing parent:');
console.log("p.func_as_prop: "  + p.func_as_prop); // function - Почему свойство в добавилось в parent? Оно же было добавлено в Base после инстанса объекта!
console.log("p.func_in_proto: " + p.func_in_proto); // undefined - Почему не ищет в прототипе Base?

console.log('Testing Base:');
console.log("Base.func_as_prop: "  + Base.func_as_prop);
console.log("Base.func_in_proto: " + Base.func_in_proto); // undefined - Почему не ищет в своем прототипе?

danik.js 27.02.2013 14:00

Цитата:

Сообщение от Василий Б.
// function - Почему свойство в добавилось в parent?

Сейчас p.__proto__ ссылается на Parent.prototype, который ссылается на функцию, объявленную как Base. В восьмой строке ты добавляешь для этой самой функции свойство func_as_prop.

Цитата:

Сообщение от Василий Б.
console.log("p.func_as_prop: " + p.func_as_prop);

Тут свойство func_as_prop сначала ищется в объекте p, не находится, далее ищется в объекте, на который ссылается p.__proto__, тоесть в Parent.prototype - и там оно находится.

Цитата:

Сообщение от Василий Б.
// undefined - Почему не ищет в прототипе Base?

Ты путаешь prototype и __proto__
Свойства ищутся в __proto__ а не в prototype
Цитата:

Сообщение от Василий Б.
// undefined - Почему не ищет в своем прототипе?

Тоже самое. "Свой" прототип - это объект, на который ссылается __proto__



Цитата:

Сообщение от Василий Б.
Parent.prototype = Base;

Не потерял ли ключевое слово new?

rgl 27.02.2013 14:49

Плюк ко всему - имена выбраны неудачно. Может, Parent переименовать в Child?

Василий Б. 27.02.2013 15:52

Цитата:

Не потерял ли ключевое слово new?
потерял. теперь все вообще по другому стало:
Base = function(){};
Child = function(){};
Child.prototype = new Base;

var c = new Child();

// Добавляем к Base метод и метод в прототип.
Base.func_as_prop = function(){};
Base.prototype.func_in_proto = function(){};

console.log('Testing Child:');
console.log("c.func_as_prop: "  + c.func_as_prop); // undefined
console.log("c.func_in_proto: " + c.func_in_proto); // function 

console.log('Testing Base:');
console.log("Base.func_as_prop: "  + Base.func_as_prop); // function 
console.log("Base.func_in_proto: " + Base.func_in_proto); // undefined

и все же я не могу понять разницу между __proto__ и prototype. Сейчас ещё раз попробую почитать, но описанной информации мне как-то не достаточно для полного понимания..


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