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