2009-03-09 3 views
2

Вопрос с точки зрения дизайна языка.Какие уроки можно извлечь из прототипа в javascript?

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

В варианте: -

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

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

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

  • ненужное засорение объекта пространства имен, 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, поскольку есть много я пытаюсь передать, но важное решение и мнение эксперта может быть неоценимой.

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

спасибо,

Майк

редактировать: предложение, мы надеемся, имеет смысл сейчас.

+0

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

+0

Подождите, я сделал ошибку (конструктор (конструктор x)) здесь не имеет смысла: S –

+0

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

ответ

4

Steve Yegge написал хорошую техническую статью о prototype model.

+0

Спасибо, это было определенно довольно просветительским –

+0

[сарказм] Если я получу просветляющий значок, тогда я бы знал, что вы просветлены. ;) [/ sarcasm] В любом случае, удачи в вашем коде. : D – MrValdez

0

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

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

0

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

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

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

+0

Я абсолютно не думаю, что его веб-программирование: P - учитывая, что я работаю с js вне браузера. Я проделал некоторое чтение о себе, и это был только второй вывод, но я прочитал, что его модель наследования кажется привязанной или бросившейся, для чего это стоит. –

2

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

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

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

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

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

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

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

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

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

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

+0

Спасибо, я ценю ответы, не знал о hasOwnProperty() и неясно о точной таксономии w.r.t obj/constructor/prototype, которую вы очистили. Потребность в hasOwnProperty(), хотя и заставляет меня думать, что прототипы на самом деле немного грязны, но это цена, которую вы платите, я думаю. –

 Смежные вопросы

  • Нет связанных вопросов^_^