0

我正在尝试构建一个自定义集合(我们称之为 GenericList),它可以容纳 n 个集合并表现得就像它只是一个集合一样。

为了继承普通 Backbone 集合的所有功能,我将 GenericList 的原型设置为Backbone.Collection. 然后我覆盖重要​​的,如, fetch(),reset()等等。现在还有一些我想从 GenericList 中剔除的功能(基本上是添加和创建)。on()off()

所以为了删除这些函数,我首先得到我的实例原型,Backbone.Collection然后是 Backbone.Collections 原型,它只是一个Object包含所有集合函数的原型。当我delete从那里调用函数时,我的应用程序中的所有 Backbone.Collection 实例都会丢失这些函数,因为它们都继承自那个对象。

所以我的问题是,除了隐藏对象上的函数之外,是否还有其他技术delete,即使该函数是在对象原型链中的任何位置定义的?

编辑:链接一个小提琴......github上的东西

4

2 回答 2

0

好吧,这正是原型在 Javascript 中的工作方式。当您在 Javascript 中引用从原型继承的属性时,实际发生的是 Javascript 首先在对象本身上查找该属性,如果没有找到,它会沿着原型链向上移动以查找该属性。这发生在属性查找时,它发生在实际原型对象上,而不是抽象原型定义上。因此,如果您从用作原型的对象中删除某些内容,那么紧接着您将无法再引用该属性,即使在从该对象继承的对象中也是如此。

换句话说,Javascript 中没有“类”和“实例”这样的东西。只有实例。

要正确执行此操作,您需要在从 Backbone.Collection 创建函数从 GenericList 中删除该函数。否则,您实际上是在修改 Backbone.Collection。

于 2012-09-28T11:21:23.607 回答
0

我已经完成了我想要的,不是从继承new Backbone.Collection而是从_.clone(Backbone.Collection.prototype). 这样我就有了自己的物理对象作为原型,并且能够删除我想要的任何内容,而不会影响其他集合。

如果您对代码感兴趣,我在github上更新了它(第 114 行)。

于 2012-09-28T13:22:32.930 回答