对某些函数的对象原型的阻塞函数查找?

时间:2012-09-28 11:09:51

标签: javascript function inheritance backbone.js prototype

我正在尝试构建一个自定义集合(让我们称之为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 个答案:

答案 0 :(得分:0)

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

换句话说,没有"类"和一个"实例"在Javascript中。只有实例。

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

答案 1 :(得分:0)

我完全没有从new Backbone.Collection继承而是从_.clone(Backbone.Collection.prototype)继承我的想法。这样我就可以将自己的物理对象作为原型,并且能够删除任何我想要的东西,而不会对其他集合产生影响。

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