Зачем использовать наследование прототипов в javascript? - PullRequest
10 голосов
/ 03 сентября 2011

перфорация

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

Вот пример фиктивного кода:

var lower  = {
    "foo": "bar"
};

var upper = {
    "bar": "foo"
};

var chained = Object.create(lower,  pd(upper));

var chainedPrototype = Object.create(chained);

var combinedPrototype = Object.create(pd.merge(lower, upper));

var o1 = Object.create(chainedPrototypes);
var o2 = Object.create(combinedPrototypes);

использует pd, потому что дескрипторы свойств многословны как ад.

o2.foo быстрее, чем o1.foo, поскольку он идет только по двум цепям прототипов, а не к трем.

Поскольку путешествие по цепочке прототипов стоит дорого, почему мы строим ее вместо использования композиции объектов?

Другой лучший пример:

var Element = {
  // Element methods
}

var Node = {
  // Node methods
}

var setUpChain = Object.create(Element, pd(Node));
var chained = Object.create(setUpChain);
var combined = Object.create(pd.merge(Node, Element));

document.createChainedElement = function() {
  return Object.create(chained);
}

document.createCombinedElement = function() {
  return Object.create(combined);
}

Я не вижу кода, объединяющего объекты-прототипы для эффективности. Я вижу много прототипов, связанных цепочкой построения кода. Почему последний более популярен?

Единственная причина, по которой я могу придумать, - это использовать Object.isPrototypeOf для проверки отдельных прототипов в вашей цепочке.

Помимо isPrototypeOf есть ли явные преимущества использования наследования перед композицией?

Ответы [ 3 ]

4 голосов
/ 03 сентября 2011

Основной причиной должны стать изменения объекта-прототипа.Изменение объекта-предка будет отражено по всей цепочке.Это, возможно, может быть выгодой.Хотя я не могу сразу думать о каких-либо реальных примерах, я думаю, что принятие этой динамической природы может обеспечить динамику, которую просто не обеспечивают другие языки (читай: на основе классов).

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

Тем не менее, если эта функциональность не нужна, нет смысла использовать цепочку прототипов над композицией.

0 голосов
/ 01 февраля 2013

Вот некоторые преимущества, которые я могу придумать в порядке важности

Использование памяти

Используя прототип, вы создаете общие свойства. Ваш подход копирует все значения для каждого объекта.

Первоначальная стоимость создания объектов

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

InstanceOf

Хороший код не использует instanceOf, но иногда вы не можете сделать весь свой код идеальным, так зачем ломать языковую функцию?

Динамическое изменение прототипа

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

Плагин без стыда: http://js -bits.blogspot.com / 2010/08 / javascript-inheritance-done-right.html

Последнее примечание Если вы на самом деле являетесь узким местом в приложении, я бы не хотел использовать его для рассматриваемых объектов

0 голосов
/ 03 сентября 2011

Хорошо, подумайте, что произойдет, если lower или upper изменились. Объединенный прототип не будет отражать это изменение, поскольку вы создали новый объект, скопировав из него свойства.

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

...