我正在尝试构建一个自定义集合(让我们称之为GenericList),它可以容纳n个集合,并且就像它只是一个集合。
为了继承普通Backbone集合的所有功能,我将GenericList的原型设置为Backbone.Collection
的新实例。然后我会覆盖重要的内容,例如fetch()
,reset()
,on()
,off()
等等。现在还有我希望从GenericList中踢出的函数(基本上是添加和创建)。
因此,为了删除这些函数,我首先获取我的实例原型Backbone.Collection
,然后获取Backbone.Collections原型,它只是一个包含所有集合函数的Object
。当我delete
那里的函数时,会发生的事情是,整个我的应用程序中的所有Backbone.Collection实例都松散了这些函数,因为它们都从那个Object继承。
所以我的问题是,是否有其他技术而不是delete
隐藏对象上的函数,即使该函数是在对象原型链中的任何位置定义的?
答案 0 :(得分:0)
嗯,那就是原型在Javascript中的运作方式。当您在Javascript中引用从原型继承的属性时,实际发生的是Javascript首先在对象本身上查找该属性,如果它没有找到它,它会沿着原型链向上移动到找到该物业。这发生在属性查找时,它发生在实际的原型对象上,而不是抽象的原型定义上。因此,如果您从作为原型使用的对象中删除某些内容,那么紧接着您将无法再引用该属性,即使在从该对象继承的对象中也是如此。
换句话说,没有"类"和一个"实例"在Javascript中。只有实例。
为了正确执行此操作,您需要在从Backbone.Collection创建之后从GenericList 中删除该函数。否则,您实际上正在修改Backbone.Collection。
答案 1 :(得分:0)
我完全没有从new Backbone.Collection
继承而是从_.clone(Backbone.Collection.prototype)
继承我的想法。这样我就可以将自己的物理对象作为原型,并且能够删除任何我想要的东西,而不会对其他集合产生影响。
如果您对代码感兴趣,我会在github更新它(第114行)。