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