Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   Понимание ООП в JavaScript (https://javascript.ru/forum/misc/3070-ponimanie-oop-v-javascript.html)

kefi 15.03.2009 13:23

Понимание ООП в JavaScript
 
Чей-то почитал тут и там статьи и разное и запутался совсем . Что же такое ООП в JavaScript ...
Хотелось бы в этой теме провентилировать разные конкретные вопросы.

Первый вопрос , чтобы зацепиться, такой :

Если Array является объектом (встроенным) со свойствами constructor,length,prototype,concat,join etc..., то почему же я получаю эти свойства у его прототипа, а не у него самого :
alert(Array.prototype.hasOwnProperty("join") ) // true
 alert(Array.hasOwnProperty("join"))                // false
?

Тем более, что сказано в документации :
Этот метод не проверяет наличие свойства по цепочке прототипов; указанным свойством должен обладать именно сам объект. А пример выше показывает, что именно сам объект Array не обладает свойством, а обладает, наоборот, - прототип Array.prototype .
Короче , путаница получается - распутайте, плз.
Кстати, и в этом контексте также непонятно, почему :
var a = new Array(); alert(a.hasOwnProperty("join")) // false

PS Вот еще непонятные в связи с этим вопросом вещи :
var a = new Array(1,2);
alert(a.join(";")+"= a.join(';') Работает"); 

alert(a.hasOwnProperty("join")+"=a.hasOwnProperty('join') У собств НЕТ")    // false
alert(Array.hasOwnProperty("join")+"=Array.hasOwnProperty('join') У Array НЕТ") // false
alert(Array.prototype.hasOwnProperty("join")+"=Array.prototype.hasOwnProperty('join') У Array.prototype ЕСТЬ") // true
alert(Array.prototype.isPrototypeOf(a)+"=Array.prototype.isPrototypeOf(a)"); // true
alert(Array.isPrototypeOf(a)+"=Array.isPrototypeOf(a)"); // false
alert()
alert(Array.prototype.isPrototypeOf(Array)+"=Array.prototype.isPrototypeOf(Array)"); // false
alert(Array.isPrototypeOf(Array)+"=Array.isPrototypeOf(Array)"); // true
alert()
alert(Object.prototype.isPrototypeOf(Array)+"=Object.prototype.isPrototypeOf(Array)"); // true
alert(Object.isPrototypeOf(Array)+"=Object.isPrototypeOf(Array)"); // false
alert()
alert(Object.prototype.hasOwnProperty("constructor")+"=Object.prototype.hasOwnProperty('constructor')") // true
alert(Function.hasOwnProperty("constructor")+"=Function.hasOwnProperty('constructor')") // false


PPS. Может вообще кто-нибудь человеческим неформальным языком объяснить, что такое прототип, экземпляр объекта(или класса, не знаю , как правильно), объект(класс, не знаю , как в javascript надо говорить) ?

Gvozd 15.03.2009 13:38

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

kefi 15.03.2009 14:01

Цитата:

Сообщение от Gvozd (Сообщение 14354)
на всякий случай.читали вы это?особенно вторую статью.
там по моему вполне качественно объясняется.
если читали,и не поняли суть, то я даже не знаю как вам объяснить по другому

Читал, а как объяснить - просто ответить на конкретный вышепоставленный вопрос зацепку, если, конечно, Вы сам понимаете ответ. Сечас добавил еще в PS аргументы.

Gvozd 15.03.2009 14:17

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

kefi 15.03.2009 14:32

Цитата:

Сообщение от Gvozd
ваши тесты немного по разному работают в разных браузерах(вы тестировали, подозреваю в опере.в мозиле некоторые рузльтаты отличаются), и связано это с разной реализацией базовых типов

Тестировал в SciTE (точнее в WSH (WScript,Cscript) или в IE6SP1). Но это, точнее говоря не базовые , а встроенные в JavaScript типы (Array etc), поэтому если браузеры поддерживают javascript, то по встренным типам в javascript должна соблюдаться совместимость и никаких различий в их реализации быть не может .

Zeroglif 15.03.2009 14:34

Цитата:

Сообщение от kefi
Короче , путаница получается - распутайте, плз.

http://forum.dklab.ru/viewtopic.php?p=102575#102575
Цитата:

Сообщение от kefi
Если Array является объектом (встроенным) со свойствами constructor,length,prototype,concat,join etc

Вы смешиваете в кучу свойства разных объектов. У Array свои свойства, у Array.prototype свои. Array - это конструктор, функция, он не наследует от Array.prototype, от него наследуют новые массивы, "экземпляры" (new Array).

kefi 15.03.2009 14:35

Или вот такой совсем простой вопрос - что заносится, если заносится вообще, в свойство нового объекта prototype при его создании (т.е. (New {}).prototype чему равно и какого типа ) ?

Андрей Параничев 15.03.2009 14:43

kefi,
Прототип может быть только у конструктора (функции). Прототип это ссылка на объект, в котором будет производится поиск свойств, если они не были найдены в объекте, сформированным конструктором. С помощью прототипов в JavaScript реализуется наследование.

Возможно вам что-то разъяснит следующий код:
// Объявляем конструктор
var constr = function() {
    // Объявляем свойство объекта
    this.a = 1;
}

// Объявляем свойство прототипа
constr.prototype.b = 2;

// Создаем объект конструктора
var obj = new constr();

alert([obj.hasOwnProperty("a"), obj.a]); // true, 1
alert([obj.hasOwnProperty("b"), obj.b]); // false, 2


Свойства b в "собственных" свойствах объекта не было, но он был найден в прототипе. Вообще, рекомендую почитать статью о наследовании, я уверен, она ответит на ваши вопросы, касательно прототипов.

Zeroglif 15.03.2009 14:49

Погрузиться...
На глубину...

kefi 15.03.2009 14:51

2 Zeroglif > спасибо за ссылки, прочту, пока с пустой головой так быстро я не погружусь.
А пока :
Цитата:

Сообщение от Андрей Параничев
Прототип может быть только у конструктора (функции).

Где написано, или из чего следует, что он не наследуется от Object? Ведь вновь создаваемые объекты должны наследовать свойства от своих предков, общим для всех является объект Object ?


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