Javascript-форум (https://javascript.ru/forum/)
-   Общие вопросы Javascript (https://javascript.ru/forum/misc/)
-   -   "Классический" ООП в JavaScript (https://javascript.ru/forum/misc/2740-klassicheskijj-oop-v-javascript.html)

Kolyaj 03.03.2009 18:08

Цитата:

Сообщение от Dmitry A. Soshnikov
а зачем подобный оператор в других языках (Python, Ruby) и при наличии duck typing'a?

Я первый спросил.

Dmitry A. Soshnikov 03.03.2009 18:13

Цитата:

Сообщение от x-yuri
но ведь автор хочет сэмулировать классовое наследование. Возможно будут ситуации, когда прийдется вспомнить, что в Javascript нету классового наследования

А там не велика разница - если язык динамический ;) -

http://javascript.ru/forum/misc/2740...html#post12189

x-yuri 03.03.2009 18:19

мне показалось, что Pavel_Volodko скорее хочет классовое наследование как в статических языках?

Zeroglif 03.03.2009 18:38

Цитата:

Сообщение от Pavel_Volodko
Загляните в код Prototype. Там есть примеры использования.

Не хотите говорить - не надо, только в либы не посылайте... ;)
Цитата:

Сообщение от Dmitry A. Soshnikov
Python

У тебя словно переключатель в голове с надписью python, чуть потемнело - чик, "а вот в pythone так там вообще..." ;)

x-yuri 03.03.2009 18:57

Цитата:

У тебя словно переключатель в голове с надписью python, чуть потемнело - чик, "а вот в pythone так там вообще..."
Zeroglif судя по всему там действительно вообще :blink:

Dmitry A. Soshnikov 03.03.2009 19:15

Цитата:

Сообщение от Zeroglif
У тебя словно переключатель в голове с надписью python, чуть потемнело - чик, "а вот в pythone так там вообще..."

Ну здрасте! Переключатель! :) Что теперь, если идеологии, действительно, похожи (но не идентичные, естественно), а терминология разная? Можно подумать, я на пустом месте это говорю.

Цитата:

Сообщение от Zeroglif
чуть потемнело

наоборот - чуть найдена очередная схожесть конкретных технологий в общих "закономерностях"

P.S.>: да и... ты забыл Ruby еще ;) чик, "а там еще интересней Python'a и тоже - похоже на JS"

kefi 24.03.2009 16:31

Цитата:

Сообщение от Zeroglif (Сообщение 13540)
instanceof не оправдывает своего названия буквально и является терминологической натяжкой из чужого class-based мира, в js объекты наследуют от объектов, понятия "класс" не просто нет, а если бы оно даже и было, то мы бы столкнулись с задачей определения, что включить в этот термин - прототип или прототипы, конструктор или конструкторы, или всё вместе, что участвовало в создании цепочки или её составляет, при этом, если цепь прототипов после содания хе-хе "instance" можно считать стабильной и связанной с ним, то свойству 'prototype' конструкторов можно присваивать другие значения, что делает алгоритм instanceof в этом случае бесполезным.

Почему же нельзя определить Класс как пару Конструктор + прототип ?
При этом оговориться что он определяет только Начальный (т.е. при его создании) тип экземпляра.
Включать в понятие несколько конструкторов или несколько прототипов не требуется, т.к. данный конструктор содержит вызовы родительских, а данный прототип из пары Конструктор-прототип - ссылку __proto__ на родительские прототипы , что однозначно определяет всю цепь наследования. Конечно возможны с помощью данного конструктора создание экземпляров с разным набором свойств в зависимости от заданных конструктору параметров , но тем не менее - другого начального создателя у экземпляра НЕТ.

Q: Как использовать instanseof , если в текущий момент экземпляр уже на 100 км отличается от того, что использовался при его создании ?
A: Так же как и если бы он не отличался. Т.е., imho ,это вопрос вообще говоря о том, как вобще использовать instanceof в классическом ООП.

Zeroglif 24.03.2009 21:26

Цитата:

Сообщение от kefi
Почему же нельзя определить Класс как пару Конструктор + прототип ?

Можно определить, никто не мешает тому, как именно держать это в уме.

Цитата:

Сообщение от kefi
что однозначно определяет всю цепь наследования

Ваш первоначальный конструктор может быть пустой безымянной функцией, которая связывает прототип с объектом и тихо помирает - ни имени, ни тела, ничего. То, что это первоначальный создатель видно по коду, но обычными словами род/тип объекта не выразить, признаков нет, уцепиться не за что. Суть объекта (что он наследует) возможно будет выражена где-то выше, допустим в цепи его прототипов есть Func.prototype, и этот конструктор Func вполне себе попадает в instanceof, хотя конструктором вышеуказанного объекта не является ни разу.

kefi 24.03.2009 22:07

[code=Zeroglif]Можно определить, никто не мешает тому, как именно держать это в уме.[/code]
Так я же попытался не в уме , а на бумаге это определить.
Цитата:

Сообщение от Zeroglif
Ваш первоначальный конструктор может быть пустой безымянной функцией

Ввиду слабости в javascript я как-то не могу себе представить, как это возможно анонимный конструктор и его прототип сделать потомками еще какой бы то ни было пары Конструктор-прототип, т.е. я имею ввиду направить свойство __proto__ прототипа сопровождающего анонимный конструктор на другой прототип , ведь прототип , сопровождающий анонимный конструтор это Function.prototype :
Имеются тождества :
{n:"132" }.constructor===Object ;
{}.constructor===Object ;
function(){}.constructor===Function ;
Т.е. не будет в цепи наследования анонимных конструкторов .
Докажите, плз, если, где я ошибаюсь.
Впрочем, есть и такой вариант :
var s=new function(){this.n="132" ; } ; s.constructor!==Function
Но все равно и здесь не направить, свойство __proto__ на предка.

Вот. Но это одно.
А второе - если основывать приложения на простом правиле - не делать в цепи наследования анонимных конструкторов, то вопрос снимается .

Для ненаследуемого же экземпляра , созданого анонимным конструктором всегда можно говорить , что это экземпляр типа(класса)
и далее приводить литеральное описание класса, который использовался для создания. Что конечно многословно, но для устранения многословнояти при описании можно пользоваться придумаными именами для обозначения этого класса .

x-yuri 24.03.2009 23:26

ну это все детали, на самом деле
меня вот, например, интересует, зачем использовать классическое наследование в js. Пока я вижу одну причину: так привычнее людям, пришедшим с других языков


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