10

性能

为什么我们要构建原型继承链而不是使用对象组合。通过原型查找链中的每一步都会变得很昂贵。

这是一些虚拟示例代码:

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使用继承而不是组合有明显的优势吗?

4

3 回答 3

4

主要原因必须是对原型对象的更改。对祖先对象的更改将反映在整个链中。可以想象,这可能是一个好处。虽然我无法立即想到任何现实世界的实例,但我认为拥抱这种动态特性可以提供其他(阅读:基于类)语言根本不提供的动态。

原型链上游的对象可以在应用程序的整个生命周期中根据需要发展,这些变化将反映在所有后代对象中。这可以很容易地与 JavaScript 的函数结合为一流的对象,以根据需要动态修改功能。

也就是说,如果不需要此功能,则没有理由使用原型链而不是组合。

于 2011-09-03T16:25:54.313 回答
0

好吧,考虑一下如果lowerupper改变会发生什么。组合原型不会反映这种变化,因为您通过复制它们的属性创建了一个新对象。

对于许多情况来说这很好,但它肯定不如为您的对象实际构建适当的原型链那样动态。

于 2011-09-03T16:28:23.290 回答
0

以下是我能想到的一些好处,按重要性排序

内存使用情况

通过使用原型,您可以创建共享属性。您的方法将所有值复制到每个对象。

设置对象的前期成本

以为您稍后会节省一点时间,但在设置对象时会产生复制属性的成本。您最好在性能测试中考虑到这一点。如果您阅读的内容比设置对象的内容多得多,那么这个好处可能会被超越。

实例

好的代码不用instanceOf,但有时你不能让你的所有代码都完美,那为什么要破坏一个语言特性呢?

动态更改原型

大多数人会声称他们永远不需要这个(像我一样),但是我们中的许多人在实例化一些数组之后扩展了 Array.prototype (不是你应该这样做)。使用复制属性方法,您将失去对原始对象的引用。

无耻插件:http: //js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html

最后一点如果您这实际上是应用程序中的瓶颈,我不会不愿意将它用于有问题的对象

于 2013-02-01T18:27:49.217 回答