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