Javascript:函数链接

解决办法:不行。 你不能这样做。 用&&​​链命令并用它来完成。

tl; dr:在random.function("blah").check() ,如果function("blah")返回false,我该如何忽略check() 或者这甚至有可能?

的背景:

好的,所以我很讨厌代码。 但我试图通过编码来让事情变得轻松些,这会拖延我的生活。 我的意思是微观上的。 所以基本上,我的整个项目都基于对象和插件。 (插件是包含对象的附加.js文件,例如,afk.js看起来像这样:

global.afk = function(){};
afk.check = function(){ ... };

通过加载该js文件,我可以访问afk对象和其中的所有函数。 可能效率不高,但它的工作原理和它确定什么功能在做什么更容易。

回到拖延位。 因为我不知道哪些插件被加载,所以在一些共享core.js文件中,有这些条件语句: if (plugin.has("afk")) { afk.check(); }; if (plugin.has("afk")) { afk.check(); }; 然而,我感到无聊,并使plugin.has()返回实际的对象,而不是'真',所以我可以这样做:

plugin.has("afk").check();

它按预期工作。 除非没有afk插件,这会引发“false没有方法检查”的明显错误。

那就是这样。 有任何想法吗? 另外,如果您对任何事情有任何疑虑,请告诉我。 我知道我做了很多错误/效率低下的事情,并且在我弄明白的时候修复它们是很好的。


返回的对象应该具有该功能,否则会出错。 你可以做的是建立一个基本的对象类型,它总是返回。 与返回时相比,它有一个空函数,不会产生错误。

就像是:

var baseObj = function(){
    this.afk = function(){
        return this;
    }
    this.check = function(){
        return false;
    }
};

var advObj = new baseObj();
advObj.afk = function(){
    // extended func
    return new baseObj();
}

var a = new advObj();
a.afk("test").check();

所以jQuery有点像这样:

$(plugin) - >返回一个像对象一样的集合
.has("afk") - >过滤内部集合,并返回集合
.check() - >对此集合执行的操作

所以我们举一个小例子:

function Wrapper(ele) {
  // make our collection
  this.coll = [ ele ];

  // function to filter
  this.has = function(filter) {
    this.coll = this.coll.filter(function(e) {
      return e === filter;
    });

    // we return ourself for chaining
    return this;
  };

  // function to execute on ourself
  this.check = function() {
    // returns actual value
    return this.coll.length;
  };
}

var $ = function(ele) {
  // wrapper around the `new` syntax
  return new Wrapper(ele);
};

console.log($('jan').has('jan').check()); // gives 1
console.log($('pietje').has('jan').check()); // gives 0

很酷的事情是你现在可以通过扩展原型来扩展你的Wrapper对象从外部文件:

Wrapper.prototype.hasNot = function(filter) { 
    /* do magic */
    return this;
}

在当前的ECMAScript规范中,将.check()转换为no-op(以及任何其他可能存在于不存在的插件上的方法)是不可能的,因为您不能找到可移植的未定义对象的未定义属性。

拟议的“直接代理”ECMAScript API似乎可以解决这个问题,但尚未标准化。 我也怀疑用这种方式代理你的代码效率不高,因为你会(AIUI)必须让你的.has()函数返回一个代理对象,然后必须为每一个“错过”的函数调用做真正的工作。 恕我直言,只要确保条件代码永远不会运行就会好得多。

所以,除了其他地方提出的&&方法之外,我所能提供的仅仅是:

plugin.if("afk", function() {
    // put conditional code here
});
链接地址: http://www.djcxy.com/p/12853.html

上一篇: Javascript: Function Chaining

下一篇: Authenticating SQL connection using AD login details outside the domain