【问题标题】:How to chain a method that has a namespace?如何链接具有命名空间的方法?
【发布时间】:2014-09-11 08:09:15
【问题描述】:

如果我有这样的功能

namespace.functionName = function() { 
   /// some code
 }

如何在方法链中使用它,例如:

$("#element1").show().namespace.functionName()

上面的语句给出了一个错误说“无法读取未定义的属性'functionName'”

【问题讨论】:

  • 如果函数与链无关,则不能在链中使用它。 show() 需要返回一个具有属性functionName 或属性namespace 的对象。如果它不这样做,你就不能简单地“拉”namespace.functionName 到链中。
  • 在 javascript 中也没有命名空间这样的概念(据我所知)。您可以通过将函数放入对象来构建代码。

标签: javascript jquery method-chaining


【解决方案1】:

坦率地说,你所做的尝试没有任何意义。但是要实现函数链接,您可以通过

var namespace = {};

namespace.functionName = function() { 
   alert("hi");
 }

function show() {

    alert("do 1");
    /*just return the parent object of the namespace 
      assuming the namespace to be in global scope */
    return window;

}

show().namespace.functionName();

注意

方法链接的工作原理是,我们调用的第一个函数返回一个对象,该对象公开要在链中调用的进一步方法。因此,在您解释的情况下,不编辑您指定的 show() 方法是不可能的。

或者正如@RobG 建议的那样,您可以创建一个包装函数,该函数调用您所需的函数,然后返回所需的链接对象。

【讨论】:

  • 您可以将 show 方法替换为调用它然后返回所需对象的包装器。它会与调用它并期待默认返回混淆......
  • @RobG:是的。这就说得通了。 :)
  • 是的,但我认为您应该强调“没有任何意义”部分,并强调这绝对不是建议。这对许多人来说似乎很明显,但是...
  • @mithunsatheesh : 如果我有像你的例子那样的代码,那么 show().namespace.functionName() 是一个有效的代码行吗?
  • @AliLane :不,它不会工作。阅读代码以了解如何实现链接。这不是火箭科学。您必须为 show 制作一个包装器,并在内部调用 show 方法后返回您需要链接的对象。
【解决方案2】:

对于 jQuery 你可以这样做

var yourNamespace = {};
yourNamespace.myFunction = function() { console.log("hey"); };
jQuery.fn.namespace = yourNamespace;

然后像疯了一样

$("a:first").show().namespace.myFunction();

但请注意,函数的上下文可能是命名空间对象,而不是 jQuery 项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-13
    • 1970-01-01
    • 2010-12-25
    • 2011-08-29
    • 1970-01-01
    • 2011-05-10
    相关资源
    最近更新 更多