Какие шаблоны вы можете использовать с наследованием прототипов, чего нельзя использовать с классом? - PullRequest
15 голосов
/ 07 июня 2011

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

Какие шаблоны вы можете использовать с наследованием прототипов, которые нельзя использовать с наследованием классов, и какое руководство вы бы дали, когда / если его использовать?

Ответы [ 4 ]

2 голосов
/ 08 июня 2011

Одно отличие (возможно, по крайней мере концептуально) состоит в том, что наследование классов подразумевает, что дочерний тип IS-A является родительским. Наследование прототипа не имеет такого значения; млекопитающее является прототипом для кошки (определение Merriam-Webster говорит, что это означает, что это «образец для»), но не более того. Кошка может свободно удалять / добавлять / изменять поведение по своему усмотрению.

1 голос
/ 07 июня 2011

Хорошо, я добавлю один, использую тот факт, что ссылки прототипов являются живыми для методов monkey-patch для целого класса объектов:

var Cat = function(catName) {
    this.catName = catName;
};
Cat.prototype.meow = function() {
    console.log(this.catName+" says meow");
}
var mittens = new Cat("Mittens");
var whiskers = new Cat("Whiskers");
mittens.meow(); // "Mittens says meow"
whiskers.meow(); // "Whiskers says meow"

// All cats are now angry
Cat.prototype.meow = function() {
    console.log(this.catName+" says hissssss");
}
mittens.meow(); // "Mittens says hissssss"
whiskers.meow(); // "Whiskers says hissssss"

Это было бы полезно, если у вас есть объекты, которые внезапнонужно начать действовать совершенно другим, но последовательным образом в ответ на какое-то глобальное событие.Может быть для чего-то вроде:

  • Темы и обложки
  • Работает ли страница в «онлайн-режиме» или «офлайн-режиме» (в то время как в режиме онлайн все запросы хранятся / извлекаются через ajax,в то время как автономные запросы перенаправляют в хранилище браузера)
0 голосов
/ 08 июня 2011

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

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

Но я скажу, что это оказалось полезным:

Однажды, когда я работал в ActionScript 2 (не для слабонервных, поскольку это почтинедетерминированный язык) внутри контейнера ActionScript 3.Неизвестным побочным эффектом этой проблемы является то, что она устраняет представление об уровнях памяти (что является существенным для унаследованного кода моей компании).Мне удалось добавить строку: MovieClip.prototype._level0 = _root;, и это решило проблему.

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

0 голосов
/ 08 июня 2011

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

Поэтому я рассмотрю ваш вопрос так, как если бы вы имели в виду:

Какие шаблоны можно использовать с наследованием прототипов JavaScript, которые нельзя использовать с наследованием классов в языках, которые его поддерживают?

R = Как правило, большинство объектно-ориентированных языков, основанных на наследовании классов, создают объекты с жесткой структурой, они всегда будут иметь одни и те же методы и свойства в течение своей жизни, и все объекты одинаковых классов будутимеют одинаковую структуру.

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

  • Добавление или удаление методов или свойств для objна лету

* Это так хорошо поддерживается в JavaScript благодаря его динамической междоменной совместной работе.Иногда вам нужно загрузить внешние скрипты с других веб-сайтов, но нужно добавить новые функции, не имея возможности изменить исходный код из этих внешних библиотек.

...