Форум dkLab и Denwer
Здесь общаются Web-разработчики.
Генеральный спонсор:
Хостинг «Джино»

О прототипах... (Maus, оценка: 1)
Author Message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 81
   поощрить/наказать


PostPosted: Tue Oct 27, 2009 12:27 am ()
   Post subject:
Reply with quote


М

Выделено из темы «Создание FAQ»,
расположенной в форуме Разное :: JavaScript (28 Октября 2009, 19:08).
Back to top
View user's profile Send private message Send e-mail
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 270
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Tue Oct 27, 2009 12:27 am (спустя 1 секунду; написано за 24 секунды)
   Post subject:
Reply with quote

Dmitry A. Soshnikov wrote:
Прототип любого объекта (за исключением некоторых системных) - это внутреннее свойство [[Prototype]];
и как этим внутренним свойством воспользоваться?
Back to top
View user's profile Send private message
Dmitry A. Soshnikov
Заглянувший



Joined: 26 Oct 2007
Posts: 18
Карма: 3
   поощрить/наказать

Location: Saint-Petersburg

PostPosted: Tue Oct 27, 2009 1:20 am (спустя 53 минуты; написано за 2 минуты 25 секунд)
   Post subject:
Reply with quote

Quote:
и как этим внутренним свойством воспользоваться?
Через косвенные ссылки, либо, в некоторых реализациях есть расширение: __proto__.

В этом отношении текущая версия ES отклоняется от общей теории, где прототип может быть свободно изменён на другой объект. Сейчас по стандарту прототип объекта изменён быть не может (за исключением, опять же, расширений типа __proto__). Косвенная же ссылка, если она ещё осталась жива, позволяет лишь дописывать свойства, но не менять прототип полностью.
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Tue Oct 27, 2009 3:35 pm (спустя 14 часов 14 минут; написано за 5 минут)
   Post subject:
Reply with quote

Dmitry A. Soshnikov, по-моему следует пояснять на примере:
Code (JavaScript): скопировать код в буфер обмена
MyObj= function () {
};

MyObj.prototype= {
   a : function () {
      alert('a');
   }
};
obj1= new MyObj ();

MyObj.prototype= {
   d : function () {
      alert('d');
   }
};

obj2= new MyObj ();
obj2.a(); // нет свойства
obj2.d(); // все OK
obj1.a(); // все OK
obj1.d(); // нет свойства
 
То есть прототип заменяется, но объекты, которые были созданы со "старой" версией прототипа с ней и остаются
Back to top
View user's profile Send private message
Dmitry A. Soshnikov
Заглянувший



Joined: 26 Oct 2007
Posts: 18
Карма: 3
   поощрить/наказать

Location: Saint-Petersburg

PostPosted: Wed Oct 28, 2009 1:20 am (спустя 9 часов 44 минуты; написано за 1 минуту 17 секунд)
   Post subject:
Reply with quote

dimagolov wrote:
но объекты, которые были созданы со "старой" версией прототипа с ней и остаются
Да, и эта связь (по текущей версии стандарта) - уже неразрывна и неизменна. Вот в этом пункте (javascript.ru/blog/Dmitry-A.-Soshnikov/Tonkosti-ECMA-262-3.-CHast-7.-OOP.#prototip) подробно это описано.
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 270
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Wed Oct 28, 2009 9:38 am (спустя 8 часов 17 минут; написано за 6 минут 10 секунд)
   Post subject:
Reply with quote

dimagolov
Я извиняюсь, но Ваш пример мне ничего не проиллюстрировал/
Code (JavaScript): скопировать код в буфер обмена
mtest = Object();
mtest2 = Object();
MyObj= function () {
};
// раз все - объекты, то пусть и прототип будет объектом
MyObj.prototype= mtest;
// экземпляр
obj1 = new MyObj();
// пока еще ничего не было
alert(obj1.d);

mtest.d = function () {
    alert('d');
}
mtest2.c = function () {
    alert('c');
}
// появилось в прототипе - стало отзываться в экземпляре
alert(obj1.d);
// 2 независимых объекта, так что здесь - undefined. логично
alert(mtest2.d);
MyObj.i = function () {
    alert('i');
}
alert("obj1.i");
MyObj.i();
alert(obj1.i);
alert(obj1.constructor.i);
alert(obj1.constructor.prototype.i);
// obj1.prototype ничего не даст
obj1.constructor.prototype = mtest2;
alert(obj1.d);
alert(obj1.c);

mtest.g = function () {
    alert('g');
}
mtest2.h = function () {
    alert('h');
}

// как видно, тоже безуспешно
alert('obj1.g');
alert(obj1.g);
alert(obj1.h);
Итак, вывод: внутреннее свойство, хранящее ссылку на прототип, существует, но пользоваться им нельзя - оно попросту недоступно. Зато можно наблюдать его проявления.
Кстати, еще один важный вопрос. Из моего примера mtest - это прототип для obj1. obj1 - это экземпляр MyObj. А что такое MyObj ??

Last edited by Maus on Wed Oct 28, 2009 11:50 pm; edited 2 times in total
Back to top
View user's profile Send private message
Dmitry A. Soshnikov
Заглянувший



Joined: 26 Oct 2007
Posts: 18
Карма: 3
   поощрить/наказать

Location: Saint-Petersburg

PostPosted: Fri Oct 30, 2009 8:29 pm (спустя 2 дня 10 часов 51 минуту; написано за 9 секунд)
   Post subject:
Reply with quote

Maus wrote:
А что такое MyObj ??
Конструктор (javascript.ru/blog/Dmitry-A.-Soshnikov/Tonkosti-ECMA-262-3.-CHast-7.-OOP.#konstruktor).
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 270
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Fri Oct 30, 2009 10:49 pm (спустя 2 часа 19 минут; написано за 41 секунду)
   Post subject:
Reply with quote

Dmitry A. Soshnikov
Если есть конструктор - то должен быть и класс?
Если есть класс - то где он?
Back to top
View user's profile Send private message
dimagolov
Участник форума



Joined: 04 Feb 2007
Posts: 1664
Карма: 96
   поощрить/наказать

Location: Christ Church, Barbados

PostPosted: Fri Oct 30, 2009 10:54 pm (спустя 4 минуты; написано за 2 минуты 7 секунд)
   Post subject:
Reply with quote

Maus, существование конструктора никак не подразумевает существования класса. его существование подразумевает создание объекта.

креме того, класс может существовать без конструктора (статические методы и свойства, абстрактные классы)
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 270
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Fri Oct 30, 2009 11:27 pm (спустя 33 минуты; написано за 8 минут 11 секунд)
   Post subject:
Reply with quote

dimagolov
Итак, классов в Javascript нет. Тогда: конструктор в Javascript - это функция специальной структуры, вызов которой с использованием ключевого слова new приводит к порождению экземпляра.
Полагаю, ни у кого нет возражений против такого определения?

К чему я это вёл:
Дмитрий Котеров wrote:
JavaScript: раз в нем нет классов, их и наследовать нельзя.
Dmitry A. Soshnikov пишет, что это
Dmitry A. Soshnikov wrote:
неточности, неверные определения
И получается, что он неправ. То, что есть какое-то другое наследование, исходному утверждению нисколько не противоречит.
Вообще, рассуждения подобного уровня в FAQ, имхо, неуместны - это нечто куда более продвинутое.
dimagolov wrote:
класс может существовать без конструктора
Хочу обратить Ваше внимание на то, что мы говорим исключительно о Javascript. В котором нет ни классов, ни статических методов, ни абстракций
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 81
   поощрить/наказать


PostPosted: Sat Oct 31, 2009 7:47 am (спустя 8 часов 19 минут; написано за 50 секунд)
   Post subject:
Reply with quote

Maus,
Quote:
Итак, классов в Javascript нет. Тогда: конструктор в Javascript - это функция специальной структуры, вызов которой с использованием ключевого слова new приводит к порождению экземпляра.
Полагаю, ни у кого нет возражений против такого определения?
Почти так, я бы даже сказал, что это не функция специальной структуры, а это вообще любая JavaScript функция... Ибо любая JavaScript функция может выступать в роли конструктора.
Back to top
View user's profile Send private message Send e-mail
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sat Oct 31, 2009 11:02 am (спустя 3 часа 14 минут; написано за 50 секунд)
   Post subject:
Reply with quote

Quote:
Если есть класс - то где он?
Его нет, поэтому и нигде. Есть 3 объекта, которые для удобства восприятия (и в рамках логики ES) можно назвать объектом-конструктором, объектом-прототипом, объектом-экземпляром. Классовая терминология (включая и 'new') не должны сбивать с толку.
Quote:
Тогда: конструктор в Javascript - это функция специальной структуры, вызов которой с использованием ключевого слова new приводит к порождению экземпляра. Полагаю, ни у кого нет возражений против такого определения?
В стандарте дано несколько простых и понятных определений:

- A constructor is a Function object that creates and initialises objects.
- Constructors are functions intended for use with the new operator.
- Objects that implement this internal method (имеется в виду метод [[Construct]]) are called constructors.

Наиболее точно для меня звучит последнее определение, в первом случае конструктору не обязательно инициализировать объект свойствами, во втором случае обязательность оператора "new" зависит от конструктора. Хотя, если под инициализацией понимать внутренние свойства, то первый вариант тоже хорош. ;-)

p.s. Удивительно. Dklab, на котором впервые детально разобрали прототипы (forum.dklab.ru/viewtopic.php?p=102530#102530) снова идёт по кругу с этими наблами неточными и внутренними ссылками на прототипы.
Back to top
View user's profile Send private message
Dmitry A. Soshnikov
Заглянувший



Joined: 26 Oct 2007
Posts: 18
Карма: 3
   поощрить/наказать

Location: Saint-Petersburg

PostPosted: Sat Oct 31, 2009 2:40 pm (спустя 3 часа 37 минут; написано за 20 минут 3 секунды)
   Post subject:
Reply with quote

Maus wrote:
Если есть конструктор - то должен быть и класс?
В какой-нибудь реализации ООП, может быть и должен. Если имеется в виду реализация ООП наподобие, которые используются в C++ или Java - должен. Но, данная реализация - всего лишь - одна из нескольких. Где-то лучше, где-то хуже, но никак не эталонная и единственная ;)
Maus wrote:
Если есть класс - то где он?
Чтобы говорить о классе (javascript.ru/blog/Dmitry-A.-Soshnikov/Tonkosti-ECMA-262-3.-CHast-7.-OOP.#staticheskaya-klassovaya-organizaciya) (классификации, типизации, формальном множестве характеристик) - надо понимать, что это. Опять же, если всё анализировать через призму какой-то конкретной реализации ООП (типа Java или C++), естественно, будет нелегко сходу осмыслить, что в альтернативной реализации данная сущность необязательна.

Если хочется для себя сделать типизацию (классификацию), т.е. разложить всю структуру объектов по полочкам и видеть, что к чему ведёт в этой системе, то, повторю, "классом" запросто можно обозначить связку "конструктор + прототип".

Более того, если говорить именно о типизации, то и сам ECMAScript классифицирует (типизирует; и иногда - строго) свои объекты. Для этого есть внутреннее свойство [[Class]] (строковое представление класса - "Array", "Object", "Date" и т.д.), которое, заметьте, так и называется. Например, метод Date.prototype.getTime бросает исключение, если [[Class]] объекта не равен "Date" (т.е. местами прослеживается строгий контроль, даже несмотря на то, что "классов нет"):
Code (JavaScript): скопировать код в буфер обмена
alert(Date.prototype.getTime.call(new Date())); // время
alert(Date.prototype.getTime.call(new String(''))); // TypeError
 
Так что - класс - это лишь классификация, типизация, а представление её (либо в виде строки, либо в виде формальной структуры, задающей поведение и состояние) - это уже реализация. В ECMAScript - внутренняя типизация осуществляется за счёт свойства [[Class]], формальная, в системе объектов - можно говорить о "конструктор + прототип".
Maus wrote:
Итак, классов в Javascript нет.
В плане, в котором вы смотрите - через призму альтернативной парадигмы, - да, нет. Но, я описал положение дел выше.
Maus wrote:
конструктор в Javascript - это функция специальной структуры, вызов которой с использованием ключевого слова new приводит к порождению экземпляра.
Полагаю, ни у кого нет возражений против такого определения?
Формально, конструктор в ES - это любая функция, поскольку любая функция имеет свойство-метод [[Construct]].

Фактически же, конструктор в ES (именно в плане конструирования объекта, выделения памяти под него) - это этот самый внутренний метод [[Construct]]. И уже затем, когда объект создан, вызывается сама функция (т.е. активируется её внутренний метод [[Call]]) с передачей в качестве this вновь созданного объекта. Поэтому саму функцию (сам код функции) можно назвать инициализатором.
Maus wrote:
К чему я это вёл:
Дмитрий Котеров wrote:
JavaScript: раз в нем нет классов, их и наследовать нельзя.
Dmitry A. Soshnikov пишет, что это
Dmitry A. Soshnikov wrote:
неточности, неверные определения
И получается, что он неправ. То, что есть какое-то другое наследование, исходному утверждению нисколько не противоречит.
Ну, естественно, именно этому утверждению - "нет классов, их (классы) и наследовать нельзя" - не противоречит. Но это, тогда, получается демагогия, игра на словах ;) Тогда сама эта фраза полностью бессмысленна. Т.к., опять же, мерка альтернативой парадигмы ООП тут не при чём.

В ES же, опять повторю, - реализовано полноценное наследование, где связные объекты могут повторно использовать код, описанный в другом объекте.

Вот классический код, который описывает объектную сущность ES и показывает наследование (т.е. мы ещё не написали сколь-нибудь сложный код, а наследование уже во всю работает):
Code (JavaScript): скопировать код в буфер обмена
alert(1..toString());
Zeroglif wrote:
p.s. Удивительно. Dklab, на котором впервые детально разобрали прототипы [?] снова идёт по кругу с этими наблами неточными и внутренними ссылками на прототипы.
А я предупреждал (и видел давно, что это уже разбиралось здесь):
Dmitry A. Soshnikov wrote:
Надо ли? Эти статьи ... разбирались уже на этом форуме.
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 270
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sun Nov 01, 2009 4:07 am (спустя 13 часов 27 минут; написано за 15 минут 14 секунд)
   Post subject:
Reply with quote

Zeroglif wrote:
Наиболее точно для меня звучит последнее определение
Занятно, но мне именно оно кажется самым бесполезным. Ибо неприменимо на практике.
Dmitry A. Soshnikov wrote:
есть внутреннее свойство [[Class]]
Я бы в данном случае перевёл как [[Разновидность]]* . Потому что мне этот упор на "классов нет" кажется очень важным; объектная модель в JS в голове нисколько не конфликтует с объектной моделью PHP. Подозреваю**, что подавляющее большинство неудачных использований наследования в JS - от привязанности (в дзен-трактовке) к понятию "класс".
Dmitry A. Soshnikov wrote:
Формально, конструктор в ES - это любая функция
Формально - да. Вот только любая - неинтересна, она должна иметь специальный вид как раз для того, чтобы проявились её "конструкторские" способности.


* что-то мне подсказывает, что его строковым представлением (почему было не сказать по-простому "значением"?) никогда не будет "Zaporozhets".
** не я один; чтение дискуссии трехлетней давности так затягивает ^_^
Back to top
View user's profile Send private message
Dmitry A. Soshnikov
Заглянувший



Joined: 26 Oct 2007
Posts: 18
Карма: 3
   поощрить/наказать

Location: Saint-Petersburg

PostPosted: Sun Nov 01, 2009 2:34 pm (спустя 10 часов 27 минут; написано за 15 минут 29 секунд)
   Post subject:
Reply with quote

Maus wrote:
Потому что мне этот упор на "классов нет" кажется очень важным
А я специально для таких случаев даже целый раздел (javascript.ru/blog/Dmitry-A.-Soshnikov/Tonkosti-ECMA-262-3.-CHast-7.-OOP.#dinamicheskaya-klassovaya-organizaciya) выделил в статье. Не лишним будет прочитать статью полностью, или, в контексте этого вопроса о "классах-не классах", хотя бы этот раздел (javascript.ru/blog/Dmitry-A.-Soshnikov/Tonkosti-ECMA-262-3.-CHast-7.-OOP.#osobennosti-klassovoy-i-prototipnoy-organizaciy).
Maus wrote:
подавляющее большинство неудачных использований наследования в JS - от привязанности (в дзен-трактовке) к понятию "класс"
Удачными-неудачными здесь могут быть реализации именно проекций, подходов к одной парадигме через призму другой. Наследование в JS, повторю, работает изначально.

Кстати, призма "дзена" тоже может сбить с толку при изучении JS. Этот форум "наследуется" от дзена? Почему так много этого слова в топиках? ;)
Maus wrote:
Формально - да. Вот только любая - неинтересна, она должна иметь специальный вид как раз для того, чтобы проявились её "конструкторские" способности.
А какой специальный вид? Оператор new, применённый к любой функции, вызовет внутренний метод [[Construct]], независимо от типов функций и "специальных видов". И да, снова повторю, "конструкторские способности" относятся именно к методу [[Construct]], который всегда один и то же, на все функции. Сама же функция ничего не создаёт, она - инициализатор в данном случае.
Maus wrote:
Я бы в данном случае перевёл как [[Разновидность]]*
* что-то мне подсказывает, что его строковым представлением (почему было не сказать по-простому "значением"?) никогда не будет "Zaporozhets".
Не будет, потому что конструктор в JS не создаёт объект нового типа (или лучше сказать - новой типизации, классификации). Всегда создаётся объект с [[Class]]-ом "Object", а для фактического разграничения (и то - условного, умозрительного, как я говорил выше - чтобы видеть, что к чему ведёт) можно уже привлечь цепь прототипов. Здесь нет новой типизации при создании "класса", т.к. в прототипной модели (во всяком случае, в теории) объекты полностью изменяемы, могут менять свой прототип и все характеристики динамически в рантайме (однако, в JS есть свои особенности, расходящиеся с общей теорией, например, в данной версии стандарта нельзя менять прототип объекта, за исключением некоторых реализаций типа __proto__).

В этом разница: класс (как формальное строгое множество характеристик) в статической организации, создаёт типизацию, из рамок которой объект не может вырваться. А динамическая классовая реализация и прототипная - могут быть очень похожи. Поэтому пара "протоип vs. класс" может быть абсолютно несущественной - опять же, смотрите пример с Python-ом из ссылки выше.
Back to top
View user's profile Send private message
Guest






Карма: 387
   поощрить/наказать


PostPosted: Sun Nov 01, 2009 3:04 pm (спустя 29 минут; написано за 2 минуты 21 секунду)
   Post subject:
Reply with quote

Quote:
Занятно, но мне именно оно кажется самым бесполезным. Ибо неприменимо на практике.
Определение, которое точно отражает суть и позволяет уточнить алгоритм в доках не может быть бесполезным на практике. Наоборот. А вот разного рода игры слов про то, что конструкция какая-то особенная или 'new' нужен всем конструкторам обязательно, или инициализация свойств обязательна, или порождение экземпляра обязательно, или чего-то там ещё... может сузить восприятие. ;-)
Back to top
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Sun Nov 01, 2009 3:05 pm (спустя 1 минуту 2 секунды; написано за 20 секунд)
   Post subject:
Reply with quote

Сорри, разлогинился.
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 270
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sun Nov 01, 2009 4:19 pm (спустя 1 час 13 минут; написано за 16 минут)
   Post subject:
Reply with quote

Dmitry A. Soshnikov wrote:
Удачными-неудачными здесь могут быть реализации именно проекций, подходов к одной парадигме через призму другой. Наследование в JS, повторю, работает изначально.
Это Вы к чему? Я и написал "использования наследования". Множественное число. Можно было написать "факты использования", "примеры использования". Если для Вас неявно, что привязанность - в уме того, кто использовал/реализовывал/косячил, то извините.
То есть сам язык, его особенности и разработчики в той моей фразе совсем-совсем не рассматриваются. Только его пользователи.
Dmitry A. Soshnikov wrote:
Этот форум "наследуется" от дзена? Почему так много этого слова в топиках?
Имхо: потому дзен - хороший инструмент анализа/оптимизации намерений и представлений. Более мощный, чем бритва Оккама. Надо только правильно его применять (-;
Dmitry A. Soshnikov wrote:
А какой специальный вид?
Например, использование в теле этой функции ключевого слов this, prototype. Во всяком случае, я не представляю, какой должна быть функция, чтобы одинаково полезными были вызовы:
Code (JavaScript): скопировать код в буфер обмена
var res = MyFunc();
var myObj = new MyFunc();
Первый вызов, уточняю, не должен нести никакого смысла в рамках "объектной модели". Как функция синуса: "вызвал? получи значение, свободен"
Dmitry A. Soshnikov wrote:
смотрите пример с Python-ом из ссылки выше
Посмотрел - код содержит синтаксические ошибки (-:
Dmitry A. Soshnikov wrote:
А динамическая классовая реализация и прототипная - могут быть очень похожи.
Из этого я вижу лишь одно следствие: не надо обманываться схожестью реализаций.

Немного оффтопика по примеру из Вашей статьи:
Code (Python): скопировать код в буфер обмена
class A(object):
 
    def __init__(self, a):
        self.a = a
 
    def square(self):
        return self.a * self.a

class B(object):
    def jumbo(self):
        return "wooba!"
 
b = B() #
print b.jumbo();

b.__class__ = A #
print b.jumbo(); #
 
Имхо, это иллюстрирует, почему в JS прототип экземпляра неизменяем. Он не может себе позволить, как питон,
Quote:
полагаться на хороший стиль пользователя “не вламываться” в определение
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 270
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sun Nov 01, 2009 4:56 pm (спустя 37 минут; написано за 6 минут 47 секунд)
   Post subject:
Reply with quote

Zeroglif wrote:
Определение, которое точно отражает суть и позволяет уточнить алгоритм в доках не может быть бесполезным на практике.
А Вы могли бы проиллюстрировать это так: покажите мне Function object, который не реализует внутренний метод [[Construct]] ? Или же покажите объект, который этот метод реализует, но при этом не является Function object-ом.
Если отражение за бетонной стеной, в нем нет пользы. Вот [[Prototype]] себя проявляет (при стуке в стену в ответ доносятся странные ухающие звуки)
Zeroglif wrote:
или 'new' нужен всем конструкторам обязательно
в определении не зря слово "intended". Я бы первые 2 определения объединил в одно: первая часть рассказывает, что они делают, а вторая - в каком духе их писать
Back to top
View user's profile Send private message
Dmitry A. Soshnikov
Заглянувший



Joined: 26 Oct 2007
Posts: 18
Карма: 3
   поощрить/наказать

Location: Saint-Petersburg

PostPosted: Sun Nov 01, 2009 6:45 pm (спустя 1 час 48 минут; написано за 16 минут 20 секунд)
   Post subject:
Reply with quote

Maus wrote:
дзен - хороший инструмент анализа/оптимизации намерений и представлений. Более мощный, чем бритва Оккама. Надо только правильно его применять (-;
Не, я лучше ECMA-262 буду использовать для решения этого вопроса (и вам советую) ;)
Maus wrote:
Например, использование в теле этой функции ключевого слов this, prototype. Во всяком случае, я не представляю, какой должна быть функция, чтобы одинаково полезными были вызовы:
Да свободно. this может быть использован для навешивания свойств определённому объекту (любому объекту, включая уже существующие), так что о конструировании тут речи может вообще не идти; prototype - туда же, наличие этого "слова" (свойства), пусть даже и для функции, не означает обособление функции. Ещё раз, все функции - конструкторы - так есть в природе ES. Что конкретно смущает? Что конкретно не понятно? Я ж не играю с вами в игру "Кто интересней придумает, как там оно устроенно", я говорю, как есть - согласно ECMA-262-3.
Maus wrote:
Первый вызов, уточняю, не должен нести никакого смысла в рамках "объектной модели". Как функция синуса: "вызвал? получи значение, свободен"
Что значит "не должен"? Кто это, вдруг, определил? Вы анализируйте со стороны, не берите на себя роль судящего, кто что должен, кто не должен - для этого надо знать общую теорию + теорию конкретной технологии. А вы опять же анализируете через призму какой-то привычной реализации и, отталкиваясь от неё, оперируете терминами "должен-не должен".
Code (Python): скопировать код в буфер обмена
class A(object):
    pass

a = A() # что значит "не должен"?
 
Более того, по алгоритму [[Construct]], который вызывает [[Call]] для инициализации, в том случае, если результатом [[Call]] является объект, то именно он будет являться результатом [[Construct]]-a; созданный же объект (this) будет удалён.
Code (JavaScript): скопировать код в буфер обмена
function A() {
  this.x = 10;
  return [1]
}

var a = new A;
alert([a[0], a.x]); // [1, undefined]
 
Maus wrote:
Посмотрел - код содержит синтаксические ошибки (-:
А, вы о мелочах. Не туда смотрите, не то анализируете. Суть не уловили (вообще). Перечитайте, будет полезно, всё-таки. Я вам об идеологии, а вы мне о синтаксических ошибках - реально не считаете это демагогией? ;)

И, кстати, там нет синтаксических ошибок. Если вы о том, что комментарии записаны не в стили Python, это связано с тем, что блог, на котором я пишу, не поддерживает подсветку Python-a, пришлось использовать подсветку JS. Сам же код, повторю, ошибок не содержит.
Maus wrote:
Из этого я вижу лишь одно следствие: не надо обманываться схожестью реализаций.
Кто это тут "обманывается" и где? ;)
Maus wrote:
print b.jumbo(); # ошибка!
Ну всё правильно, "прототип" теперь другой, делегация - к другому объекту, не имеющему метод "jumbo".
Maus wrote:
Имхо, это иллюстрирует, почему в JS прототип экземпляра неизменяем. Он не может себе позволить, как питон, "полагаться на хороший стиль пользователя “не вламываться” в определение"
Это иллюстрирует ровно то, что в Python "прототип" может быть свободно изменён в рантайме (как и в общей теории прототипирования), соответственно, изменяя диспетчеризацию для делегирования. В текущей версии ES это не предусмотрено. Просто, решили не делать, безо всяких "полагаться на хороший стиль пользователя". В ECMA-262-5(6) будет метод Object.getPrototypeOf(O), который изменит текущее поведение в сторону общей теории.
Back to top
View user's profile Send private message
Maus
Модератор



Joined: 29 Jun 2003
Posts: 8151
Карма: 270
   поощрить/наказать

Location: пос. Омсукчан Магаданской области

PostPosted: Sun Nov 01, 2009 11:34 pm (спустя 4 часа 49 минут; написано за 27 минут 8 секунд)
   Post subject:
Reply with quote

Dmitry A. Soshnikov wrote:
Да свободно [ и далее до новой цитаты]
Вот опять - зачем Вы это написали? Такое впечатление, что Вы в моих словах видите что-то совсем странное. Единственно разумное возражение от Вас могло бы быть, если бы Вы привели как раз пример полезной функции, которой я себе не представляю.
Dmitry A. Soshnikov wrote:
Что значит "не должен"? Кто это, вдруг, определил?
Представьте себе, я определил. Я ввёл этот пример, и я имею право при этом накладывать любые ограничения. Все оговорки о "не должен" и тому подобном - чтобы разговор не ушел в сторону.

Ко всем остальным: дальше, извините, оффтопик.
Dmitry A. Soshnikov wrote:
пришлось использовать подсветку JS
Ради подсветки сознательно писать неверный код? С моей точки зрения - это безответственно (если не сказать, безнравственно) по отношению к читателям.
Dmitry A. Soshnikov wrote:
Это иллюстрирует ровно то, что
слово "почему" прошло мимо Вас? И что, по-Вашему, цитата про "хороший стиль" - просто для хорошего словца? JS, в отличие от Питона, исполняется в более агрессивной среде, и доверие к коду на питоновском уровне попросту неразумно.
Dmitry A. Soshnikov wrote:
в Python "прототип"
Пример показывает, что никаких прототипов в Python нет. Ваш "прототип" не проходит даже утиную типизацию: он, может, и ходит как прототип, но крякает совершенно по-другому.
Dmitry A. Soshnikov wrote:
будет метод Object.getPrototypeOf(O), который изменит текущее поведение в сторону общей теории
Ко всеобщему счастью, он не изменит поведение в той части, в которой мой пример иллюстрировал разницу между прототипами в Javascript и тем, что Вы пытаетесь выдать за их аналог в Python. Он всего лишь сделает то самое внутреннее свойство [[Prototype]] видимым (используя мою предыдущую аналогию: бетонную стену заменит бронестекло)

Вообще, давайте на этом закончим с Питоном. Здесь ведется обсуждение прототипов и конструкторов Javascript.
В дальнейшем в теме хотелось бы видеть только контраргументы (крайне желательно - иллюстрированные рабочим кодом на Javascript) к моим утверждениями о прототипах и конструкторах в Javascript. Если контраргументов нет - тему можно закрывать.
Back to top
View user's profile Send private message
Zeroglif
Участник форума



Joined: 02 Jan 2006
Posts: 293
Карма: 61
   поощрить/наказать


PostPosted: Mon Nov 02, 2009 12:16 am (спустя 42 минуты; написано за 4 минуты 37 секунд)
   Post subject:
Reply with quote

Quote:
покажите мне Function object, который не реализует внутренний метод [[Construct]]
Можно в разных браузерах попробовать конструировать с помощью встроенных функций. Сразу станет понятно, что такие функции есть.
Quote:
Или же покажите объект, который этот метод реализует, но при этом не является Function object-ом.
А какой вывод из этого можно сделать? Не понимаю, с чем из мною сказанного несогласие. Про бетонные стены не понимаю, про бронестёкла, попроще бы а, поприземлённей. Ок? И пойдёт разговор. ;-)
Back to top
View user's profile Send private message
Dmitry A. Soshnikov
Заглянувший



Joined: 26 Oct 2007
Posts: 18
Карма: 3
   поощрить/наказать

Location: Saint-Petersburg

PostPosted: Mon Nov 02, 2009 1:07 am (спустя 50 минут; написано за 26 минут 5 секунд)
   Post subject:
Reply with quote

Maus, подождите, давайте определимся, у вас цель какая в данной беседе? Узнать, реальное положение дел или просто - отстоять свою выдуманную точку зрения? Я уважаю и рассматриваю любую точку зрения, основанную на личном мнении, однако, если ваша цель - просто её отстоять, но не принять реальное положение дел (даже, если вы его не понимаете или не хотите понимать), то я здесь уже не смогу помочь.
Maus wrote:
Единственно разумное возражение от Вас могло бы быть, если бы
Да что вы говорите? ;)
Maus wrote:
Вот опять - зачем Вы это написали?
Чтобы показать, что говоря о "специальных видах с конструкторскими способностями" - вы несли белиберду. Возражаете?
Maus wrote:
Ради подсветки сознательно писать неверный код? С моей точки зрения - это безответственно (если не сказать, безнравственно) по отношению к читателям.
Демагогия, вода. "Зрите в корень".
Maus wrote:
JS, в отличие от Питона, исполняется в более агрессивной среде, и доверие к коду на питоновском уровне попросту неразумно
Выдумки. Повторю, просто - особенность текущей реализации стандарта. К тому же, есть __proto__, позволяющий свободно менять прототип.
Maus wrote:
Пример показывает, что никаких прототипов в Python нет. Ваш "прототип" не проходит даже утиную типизацию: он, может, и ходит как прототип, но крякает совершенно по-другому.
Вот что вы имеете в виду? Какое "крякает"? Какое "по-другому"? Я обращаю ваше внимание на механизмы - общие механизмы разрешения свойств/методов, посредством делегирующего наследования. Понятие "прототип" я специально беру в кавычки, поскольку в Python, это всё же, класс. Но, вы опять анализируете верхушки, а не главную суть.
Maus wrote:
Ко всеобщему счастью, он не изменит поведение в той части, в которой мой пример иллюстрировал разницу между прототипами в Javascript и тем, что Вы пытаетесь выдать за их аналог в Python. Он всего лишь сделает то самое внутреннее свойство [[Prototype]] видимым (используя мою предыдущую аналогию: бетонную стену заменит бронестекло)
Значит, во-первых, я никогда не пытаюсь. Если я не уверен - я не беседую (при этом, в общем случае, я естественно, допускаю возможность заблуждений). Либо беседую в вопросительном ключе. Поэтому, я не пытаюсь, я передаю вам информацию. Понимать/принимать её или нет - это вы уже сами решаете.

Окончательная же версия стандарта всё ещё не вышла (есть только драфт). Возможно там сделают только getter, возможно, его можно будет полностью изменить.
Maus wrote:
Вообще, давайте на этом закончим с Питоном. Здесь ведется обсуждение прототипов и конструкторов Javascript.
Пожалуйста, не указывайте мне, о чём говорить, хорошо? ;) Если я провожу аналогию с другой технологией - значит, это нужно для понимания обсуждаемой технологии. Вам я могу лишь посоветовать в таком случае не читать то, что я пишу.
Maus wrote:
В дальнейшем в теме хотелось бы видеть только контраргументы (крайне желательно - иллюстрированные рабочим кодом на Javascript) к моим утверждениями о прототипах и конструкторах в Javascript. Если контраргументов нет - тему можно закрывать.
Значит так, давайте поступим следующим образом - если вам не интересно - вы просто не читаете этот тред. Закрывать/не закрывать - для меня большой разницы нет, я лишь пишу там и для тех, кому интересно и кто способен оценить переданную информацию. Вы для меня - собеседник (равно как и я вам). Мне не важен ни ваш статус на форуме, ни положение в иерархии (карма, "красные штаны" и прочая лабуда). У вас другое мнение? Однако же, если вам интересен ES, я всегда с удовольствием пообщаюсь ;)

P.S.: Но сейчас вы выбрали неправильный курс дискуссии, вы её воспринимаете как спор. Однако, я хочу показать вам верный курс этой дискуссии - мы обмениваемся информацией, с желанием найти истину, без желаний выиграть спор и боязни его проиграть. Мы вообще не воспринимаем беседу как спор. Общаемся на равных и не указываем никому aka: "давайте-ка, выстроились тут все в очередь и предоставляйте мне контраргументы на мою выдуманную белиберду". Ведь так? ;)
Back to top
View user's profile Send private message
Александр Михалицын
Модератор



Joined: 23 May 2008
Posts: 1299
Карма: 81
   поощрить/наказать


PostPosted: Thu Sep 09, 2010 1:25 pm (спустя 10 месяцев 7 дней 12 часов 17 минут)
   Post subject:
Reply with quote


М

Ветка выделена в отдельную тему «спам»,
расположенную в форуме Мусоропровод (09 Сентября 2010, 16:25).
Back to top
View user's profile Send private message Send e-mail
Display posts from previous:   
Post new topic   Reply to topic All times are GMT + 3 Hours
Page 1 of 1    Email to a Friend.
You cannot post new topics in this forum. You cannot reply to topics in this forum. You cannot edit your posts in this forum. You cannot delete your posts in this forum. You cannot vote in polls in this forum. You cannot attach files in this forum. You can download files in this forum.
XML