2014-02-17 102 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