2014-02-17 103 views
1

关联这个线程:JavaScript better way to modify function prototype,我想知道为什么变异实例'__proto__是一个缓慢的操作。JavaScript为什么操纵__proto__很慢?

我知道它已被弃用,我经常在网上阅读它。但我从来没有找到原因。为什么它真的被弃用,为什么它很慢?

setPrototypeOf()作为性能更好的解决方案吗?

+0

它实际上已不再被弃用,因为ES6中的兼容性原因,它已被重新引入。它通常应该避免。假设你有一只“动物”,一只“狗”是一只动物。 “__proto__”可以让你做的是声明“这只狗不再是一只动物”,它完全打破了面向对象的设计。它有一些有用的例子(比如说一些东西是“不再是一个NodeList,它像Zepto那样是一个数组),但是这些是很少见的,在我看来一般是没有道理的。 –

+0

这里是[__proto__'的ES6规范](https://people.mozilla.org/~jorendorff/es6-draft.html#sec-__proto___-property-names-in-object-initialisers),这里是从语言创建者和Mozilla首席技术官Brendan Eich https ://mail.mozilla.org/pipermail/es-discuss/2010-April/010917.html –

+0

好吧,但我仍然想知道为什么它被认为是缓慢的;;)虽然我很明白它打破了OO设计。如果我的“对象”是一个函数(如相关线程中所述),并且我不想修改'Function.prototype',那么我没有别的办法可以设置'__proto__'。谢谢! – Tot

回答

1

我想知道为什么变异实例'原型是一个缓慢的操作。

在浏览器中实现JavaScript语言的人做了一个权衡:他们想要支持这种“深奥”功能,但通过使这种操作变得更慢,使语言的其他部分更快。

编写程序后,您应该只关心__proto__的速度。对于许多用例来说,额外的“缓慢”只会导致整个程序有几个毫秒的差异,并且没有人会关心。

+1

'[...]但通过使这个操作更慢,从而使语言的其他部分更快。':你的意思是什么? :o好吧,但我仍然想知道“为什么/如何”在算法上很慢。感谢您的回答。 – Tot

+0

我不知道具体情况。想象一下,如果语言将'__proto__'复制到每个对象,以便访问速度超快。如果你改变'__proto__',那会很慢,因为它需要更新每个对象。 (我不认为这就是他们所做的,但这是语言所作的权衡。) – BraveNewCurrency

+0

我明白了。事实上,他们试图阻止手动设置'__proto__',因为人们可以设置任何东西并打破整个原型哲学。 好的,谢谢你的帮助。 :)所以我们可以修改它只有当我们完全没有其他选择。 – Tot