2013-08-22 32 views
1

根據Google style guide,應該在構造函數的原型上定義方法,並且應該使用this關鍵字在構造函數中定義屬性。屬性定義是使用敲除時的方法定義

我使用Knockout來完成我的大部分前端開發,Knockout通過將它們轉換爲函數來處理觀測屬性。也就是說,我所有的屬性現在都是方法,或多或少。這是一個重大的性能影響?有沒有使用JavaScript getters and setters的Knockout解決方法?

回答

1

首先,是的,有一個使用getter和setter的knockout插件,但它只能在較新的瀏覽器中使用。你犧牲IE8的兼容性<(這是不可避免的,因爲這些瀏覽器不支持JavaScript getters/setter)。 The plugin can be found here

您的主要觀點:瞭解風格指南的意圖很重要。因爲方法通常是可重複使用,將它們放在原型上可以節省重複的代碼和內存分配。這就是爲什麼把它們放在原型上的建議。然而,淘汰賽的觀測值是不可重複使用。它們的行爲類似於屬性:它們存儲特定於實例的信息。這種差異很重要。他們可能會功能,但它們被視爲屬性

Google風格指南根本無法解決這種情況。將它們放置在實例上不會影響性能,因爲您將它與不起作用的場景進行比較。將原型放在原型上會破壞模型。做唯一有效的工作並不是性能問題。

作爲最後一點,getters和setter插件不會使函數消失,它只是將它們隱藏在getter和setter後面。性能不會提高,因爲還需要完成相同的工作。

+0

我不知道淘汰賽,但究竟是什麼使得函數實例依賴?如果數據存儲在對象上,則不需要爲每個對象分別創建函數。 – Esailija

+0

函數必須關閉實例數據,並且必須攔截讀取和寫入,以便可以向訂戶通知更改。這些函數有一個必須發佈到的訂閱者列表,它是實例dependentdedendant(你沒有訪問它),並且通知讀者,例如計算出正在閱讀的observable,以便讀者知道建立訂閱。 – Tyrsius

+0

其實這只是淘汰賽的特質,並不是一個真正的限制。絕對沒有理由它不能使用這樣的東西:http://jsfiddle.net/Y6Dds/(是的,有些人可以考慮字符串尷尬,但Ember得到了這一切都很好) – Esailija