2012-09-28 29 views
0

我正在嘗試構建一個自定義集合(讓我們稱之爲GenericList),它可以容納n個集合,並像它只是一個集合。阻止函數查找某些函數的對象原型?

要繼承普通Backbone集合的所有功能,我將GenericList的原型設置爲Backbone.Collection的新實例。然後我重寫了像fetch()reset(),on(),off()等重要的。現在也有我想從GenericList中踢出來的函數(基本上是添加和創建)。

所以爲了刪除這些函數,我首先得到了我的實例原型,它是Backbone.Collection,然後是Backbone.Collections原型,它只是一個包含所有收集函數的Object。當我從delete那裏得到的函數,會發生什麼,在我的應用程序中,Backbone.Collection的所有實例都釋放了這些函數,因爲它們都從這個Object繼承。

所以我的問題是,除了delete之外,還有其他技術可以隱藏對象上的函數,即使該函數是在對象原型鏈中的任何位置定義的?

編輯:鏈接a fiddle...the thing on github

+2

一個演示你的問題的實際代碼示例會很好;我們可以通過這種方式給出更清晰的解釋和解決方案。 – jrajav

+0

對不起... https://github.com/sra448/nested-models-in-backbone/blob/master/model.generics.js – sra

回答

0

我已經完成了我不想從new Backbone.Collection繼承,但從_.clone(Backbone.Collection.prototype)。這樣我就擁有了自己的物理對象作爲原型,並且能夠刪除我想要的任何東西,而不會對其他集合產生影響。

如果您對代碼感興趣,我更新了github(行114)。

0

嗯,這正是原型在Javascript中是如何工作的。當您引用從Javascript中的原型繼承的屬性時,實際發生的情況是,Javascript首先在該對象上查找該屬性,如果未找到該屬性,則會沿原型鏈查找該屬性。這發生在屬性查找時,它發生在實際的原型對象上,而不是抽象的原型定義上。因此,如果您從您用作原型的對象中刪除某些內容,那麼緊接着您將無法再引用該屬性,即使在從該對象繼承的對象中也是如此。

換句話說,Javascript中沒有「class」和「instance」這樣的東西。只有實例。

爲了做到這一點,您需要從Backbone.Collection創建它之後,從GenericList 中刪除該功能。否則,你實際上是在修改Backbone.Collection。

+0

爲了澄清,我解釋了爲什麼「我的應用程序中的所有Backbone.Collection實例失去這些功能「......這是因爲它們不是」Backbone.Collection的實例「,而是碰巧具有單個對象Backbone.Collection作爲它們的原型對象的對象 – jrajav

+0

GenericList上沒有函數」add「,而是兩個停止原型鏈(意味着GenericLists原型原型)。我無法刪除它,因爲您寫的內容正在尋找其他解決方案。我想可能只是定義GenericList上的「添加」並拋出一個錯誤,但我認爲我們可以做得比這更好。 – sra

+0

你是如何創建GenericList的? (再次,代碼示例!)這適用於我:'var x = Object.create({a:1});刪除x.a;' – jrajav