Какие уроки можно извлечь из прототипа модели в 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, так как многое я пытаюсь передать, но это важное решение и экспертное мнение могут быть неоценимыми.
- все, что может улучшить мое понимание прототипа модели, хорошего и плохого.
- мысли по моему предложению
Спасибо,
Майк
Изменить: предложение, надеюсь, имеет смысл сейчас.
4 ответа
Стив Йегге написал хорошую техническую статью о прототипе модели.
Я не думаю, что ваши проблемы с прототипом модели действительны:
- ненужное засорение пространства имен объекта, obj.prototype, obj.constructor
prototype
является свойством функции конструктора, а не экземпляра объекта. Кроме того, проблема не так плоха, как кажется, из-за атрибута [[DontEnum]], который, к сожалению, нельзя установить программно. Некоторые из предполагаемых проблем исчезли бы, если бы вы могли.
Является ли это незрелым возражением, пытающимся сохранить способность рассматривать объекты как карты, которые, возможно, не являются ими?
Нет проблем с использованием объектов в качестве карт, если ключи являются строками, и вы проверяете hasOwnProperty()
,
- возможность изменять общее поведение во время выполнения кажется ненужной, когда непосредственное использование дополнительного уровня косвенности было бы более простым obj.shared.foo(). В частности, это довольно большая головная боль от реализации
Я не вижу, в чем заключается большая головная боль при реализации цепочки прототипов. Фактически, я считаю прототипическое наследование концептуально проще, чем наследование на основе классов, которое не дает никаких преимуществ в языках с поздним связыванием.
- кажется, что люди не очень хорошо понимают прототипы, например, различие между прототипом и конструктором.
Люди, которые знают только основанные на классах oo языки, такие как Java и C++, не понимают систему наследования JavaScript, новости в 11.
В дополнение к предложениям MarkusQ, вы также можете проверить Io.
Изучение "я", языка, который стал пионером прототипа модели, вероятно, поможет вам больше, чем просто думать об этом с точки зрения javascript (тем более, что вы, как и многие, ассоциируете это с "веб-программированием"). Несколько ссылок для начала:
http://selflanguage.org/
http://www.self-support.com/
Помните, что те, кто не изучают историю, обречены на ее повторное воплощение.
Возможно, будет проще попробовать несколько вещей с практическим кодом. Создайте язык с одним простым синтаксисом, какой бы он ни был, и реализуйте что-нибудь на этом языке. Затем, после нескольких итераций рефакторинга, определите функции, препятствующие чтению и написанию кода. Добавить, изменить или удалить то, что вам нужно, чтобы улучшить язык. Сделайте это несколько раз.
Убедитесь, что ваш тестовый код действительно выполняет все части вашего языка, даже с некоторыми битами, которые действительно пытаются его сломать. Попробуйте сделать все неправильно в ваших тестах (как и все правильно)