Какие уроки можно извлечь из модели прототипа в javascript?

Вопрос с точки зрения дизайна языка.

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

В варианте:-

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

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

Мои основные проблемы с моделью-прототипом, как я понимаю,

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

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

var x = new com.acme.X();
com.acme.Y(x,[]);      // apply y

(constructorsof x) // [com.acme.Y,com.acme.X,Object];

x instanceof com.acme.X;   // true
x instanceof com.acme.Y;   // true

Все отзывы приветствуются, я понимаю, что, возможно, трудно оценить мой POV, так как я многое пытаюсь донести, но это важное решение, и мнение эксперта может быть неоценимым.

  • все, что может улучшить мое понимание модели-прототипа, хороших и плохих.
  • мысли по моему предложению

спасибо,

Майк

edit: предложение, надеюсь, теперь имеет смысл.


person mike g    schedule 09.03.2009    source источник
comment
Можно вопрос поточнее? Мне трудно понять, о чем именно вы просите оставить отзыв. И я также не уверен, что понимаю ваше предложение.   -  person John Feminella    schedule 09.03.2009
comment
Подождите, я сделал ошибку (constructorof (constructorof x)) здесь не имеет смысла :S   -  person mike g    schedule 09.03.2009
comment
исправил это, фактически вернувшись к тому, что было моим первоначальным мышлением, после того, как я подумал, что связанный список имеет смысл. Обратная связь, что я предлагаю, так это систему типов, применение конструкторов добавляет типы к объекту, но больше ничего не делает. Это проще, так что какие большие компромиссы...   -  person mike g    schedule 09.03.2009
comment
? instanceof — это убийственная функция, иначе все, что у вас есть, это typeof и «угадывание», глядя на то, какие свойства имеет объект.   -  person mike g    schedule 09.03.2009


Ответы (4)



Я не думаю, что ваши проблемы с моделью прототипа действительны:

  • ненужное захламление пространства имен объектов, obj.prototype, obj.constructor

prototype является свойством функции-конструктора, а не экземпляра объекта. Кроме того, проблема не так серьезна, как кажется, из-за атрибута [[DontEnum]], который, к сожалению, нельзя установить программно. Некоторые из предполагаемых проблем исчезли бы, если бы вы могли.

незрелое ли это возражение, попытка сохранить способность обращаться с объектами как с картами, которыми они, возможно, не являются?

Нет проблем с использованием объектов в качестве карт, если ключи являются строками и вы отметили hasOwnProperty().

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

Я не понимаю, в чем заключается большая головная боль при реализации цепочки прототипов. На самом деле я считаю прототипное наследование концептуально более простым, чем наследование на основе классов, которое не дает никаких преимуществ в языках с поздним связыванием.

  • люди, похоже, не очень хорошо понимают прототипы, например. различие между прототипом и конструктором.

Люди, которые знают только языки OO на основе классов, такие как Java и C++, не понимают систему наследования JavaScript, новости в 11.

В дополнение к предложениям MarkusQ вы также можете проверить Io.

person Christoph    schedule 09.03.2009
comment
Спасибо, я ценю ответы, не знал о hasOwnProperty() и не понимал точную таксономию по отношению к obj/constructor/prototype, которую вы прояснили. Хотя потребность в hasOwnProperty() заставляет меня думать, что прототипы по своей сути немного запутаны, но я думаю, это цена, которую вы платите. - person mike g; 12.03.2009

Возможно, было бы проще попробовать несколько вещей с практичным кодом. Создайте язык с одним простым синтаксисом, каким бы он ни был, и реализуйте что-нибудь на этом языке. Затем, после нескольких итераций рефакторинга, определите особенности, которые мешают чтению и написанию кода. Добавляйте, изменяйте или удаляйте то, что вам нужно для улучшения языка. Сделайте это несколько раз.

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

person SingleNegationElimination    schedule 09.03.2009

Чтение о «я», языке, который стал пионером модели прототипа, вероятно, поможет вам больше, чем просто думать о нем с точки зрения javascript (тем более, что вы, похоже, связываете это, как и многие, с «веб-программированием»). Несколько ссылок для начала:

http://selflanguage.org/
http://www.self-support.com/

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

person MarkusQ    schedule 09.03.2009
comment
Я абсолютно не думаю, что это веб-программирование: P - учитывая, что я работаю с js вне браузера. Я кое-что прочитал о себе, и это только вывод из вторых рук, но я действительно читал, что его модель наследования кажется привязанной или поспешной, чего бы это ни стоило. - person mike g; 09.03.2009