perf
为什么我们要构建一个原型继承链,而不是使用对象组合。查找链中每一步的原型,get的代价很高。
下面是一些虚拟的示例代码:
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之外,使用继承比使用组合有明显的优势吗?
发布于 2011-09-04 00:25:54
主要原因必须是对原型对象的更改。对祖先对象的更改将在整个链中反映出来。可以想象,这可能是一个好处。虽然我不能立即想到任何真实世界的实例,但我认为拥抱这种动态特性可以提供其他(读:基于类)语言根本不提供的动态性。
原型链上更远的对象可以在应用程序的整个生命周期中根据需要演变,这些更改将在所有子对象中反映出来。这可以很容易地与作为第一类对象的JavaScript函数相结合,以便根据需要动态修改功能。
也就是说,如果这个功能不是必需的,就没有理由使用原型链而不是组合。
发布于 2011-09-04 00:28:23
那么,考虑一下如果lower或upper发生变化会发生什么。组合的原型不会反映这种变化,因为您已经通过复制属性创建了一个新对象。
对于许多情况,这是可以的,但它肯定不像为您的对象实际构造适当的原型链那样动态。
发布于 2013-02-02 02:27:49
下面是我能想到的一些好处,按重要性排序
内存使用情况
通过使用原型,您可以创建共享属性。您的方法将所有值复制到每个对象。
设置对象的前期成本
虽然您稍后会节省一点时间,但在设置对象时,您会产生复制属性的成本。如果你在你的性能测试中考虑到这一点,那就太好了。如果你阅读的内容比设置的对象多得多,这一好处可能会被抵消。
instanceOf
好的代码不使用instanceOf,但是有时候你不能让所有的代码都完美,所以为什么要破坏语言特性呢?
动态更改原型
大多数人会声称他们从来不需要这个(像我一样),但我们中的许多人在实例化一些数组之后扩展了Array.prototype (并不是说你应该这样做)。使用复制属性方法,您将丢失对原始对象的引用。
不知羞耻的插头:http://js-bits.blogspot.com/2010/08/javascript-inheritance-done-right.html
最后注意如果这实际上是应用程序中的瓶颈,我不会不情愿将其用于有问题的对象
https://stackoverflow.com/questions/7294276
复制相似问题