【问题标题】:blocking function lookup on objects prototype for certain functions?阻止对某些函数的对象原型的函数查找?
【发布时间】:2012-09-28 11:09:50
【问题描述】:

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

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

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

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

编辑:链接a fiddle... the thing on github

【问题讨论】:

标签: javascript function inheritance backbone.js prototype


【解决方案1】:

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

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

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

【讨论】:

  • 为了澄清,我在解释为​​什么“我的应用程序中的所有 Backbone.Collection 实例都失去了这些功能”......这是因为它们不是“Backbone.Collection 的实例”,而是发生的对象将单个对象 Backbone.Collection 作为其原型对象
  • GenericList 上没有“add”函数,但原型链上有两个停止(即在 GenericLists 原型上的原型)。由于您所写的内容和正在寻找另一种解决方案,我无法在那里删除它。我正在考虑可能只是在 GenericList 上定义“添加”并引发错误,但我认为我们可以做得更好。
  • 你是如何创建 GenericList 的? (再次,代码示例!)这对我有用:var x = Object.create({a: 1}); delete x.a;
  • 您可以在这里查看link。在第 113 行,我从 Backbone.Collection 继承,在第 26 行,我尝试删除不需要的功能。如果你愿意,我可以简化。
  • 如果没有大的重构,我唯一能想到的就是在你的对象中将“add”和“create”设置为 null。与“未定义”不同,如果将属性设置为“空”,则不会执行原型查找(因为它被视为实际值)。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 2020-09-23
    • 1970-01-01
    • 2016-03-03
    • 1970-01-01
    • 1970-01-01
    • 2016-04-14
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多