Javascript链接和变量替换

Javascript链接和变量替换,javascript,chaining,method-chaining,Javascript,Chaining,Method Chaining,我正在尝试使用变量替换使javascript链接正常工作。无法让它工作。谢谢你的帮助 var Class = function() { this.one = function() { alert('one'); return this; } this.two = function() { alert('two'); return this; } if (this instanceof Class) { return this.Cla

我正在尝试使用变量替换使javascript链接正常工作。无法让它工作。谢谢你的帮助

var Class = function() {

 this.one = function() {
   alert('one');        
   return this;
 }

 this.two = function() {
   alert('two');
   return this;
 }

 if (this instanceof Class) {
    return this.Class;
 } else {
    return new Class();
 }

}

var test = new Class();
// this works
test.one().two();

var func = '.one().two()';
// want to make this work
test[func];

强烈不推荐。您可能希望尝试使用数组:

var funcs = ['one','two'];
for(var i = 0; i < funcs.length; i++) {
  test[funcs[i]]();
}
var funcs=['one','two'];
对于(变量i=0;i
然后,您可以将其包装成一个小函数:

function callChain(obj, funcs)
{
  for(var i = 0; i < funcs.length; i++) {
    obj[funcs[i]]();
  }
  return obj;
}
函数调用链(obj,funcs)
{
对于(变量i=0;i

编辑:如果链存储为字符串:
.one().two()
,则可以使用拆分和字符串函数动态生成数组。

没有名为“.one().two()的函数”

试试这个

test['one']()['two']();
编辑:
我相信您只是出于学习目的而不是在生产现场使用它。

您可以在构造函数中添加一个方法:

 this.chain = function chain(){
   if (arguments.length && /\./.test(arguments[0])) {
    return chain.apply(this,arguments[0].split('.'));
   }
   var methods = [].slice.call(arguments),
       method = methods.shift();
   if(this[method] instanceof Function){
    this[method].call(this);
   }
   if (methods.length){
    chain.apply(this,methods);
   }
   return this;
 }
 // now you could do something like:
 test.chain('one.two.one.two.two');
或扩展对象。原型

Object.prototype.chain = function chain(){
   if (arguments.length && /\./.test(arguments[0])) {
    return chain.apply(this,arguments[0].split('.'));
   }
   var methods = [].slice.call(arguments),
       method = methods.shift();
   if(this[method] && this[method] instanceof Function){
    this[method].call(this);
   }
   if (methods.length){
    chain.apply(this,methods);
   }
   return this;
};
// usage
({one:function(){console.log('I am one');},
  two:function(){console.log('I am two');}})
 .chain('one.two.one.one.two.two.two.one.two');

好吧,你所要求的远不是最佳实践,所以我会给你一个不受欢迎的答案-使用。
如果您的输入是字符串形式的常规代码,那么您实际上没有任何其他选项(特别是当您的函数具有参数-
.one(1+0.5).two(new Date())

例如,在
类中添加:

this.excecute = function(commands){
    eval('this' + commands);
};
然后:

test.excecute('.one().two(4 * 5)');
工作示例:

这发出了警告“eval是邪恶的”(我认为是jslint)——但我不相信函数是邪恶的

更糟糕的是,如果您有字符串
'one();两(4*5);'
您也可以通过以下方式实现这一点:

这有一个额外的警告:“不要使用‘with’”——他们今天真的对我们怀有敌意,不是吗


工作示例:

感谢大家的及时帮助。我最终接受了本·罗的建议

var funcs = ['one','two'];
   for(var i = 0; i < funcs.length; i++) {
   test[funcs[i]]();
}
var funcs=['one','two'];
对于(变量i=0;i

它很符合我的要求。感谢大家的帮助。你们都很棒

我认为更简单的方法是使用javascript的数组函数。 我在写动态jquery时需要这个。一旦有了可链接的方法数组,就可以轻松地执行以下操作

var methods = ['next', 'child', 'parent'];

var element = methods.reduce(function(method){
    return $(selector)[method]();
});

console.log(element) //works! as all method names in methods array are applied and returned each iteration.

对于我来说,接受的答案对我来说不起作用,它似乎只返回传递的obj,而不是obj加上它的链式方法。

基于字符串中的函数名调用函数被认为是一种不好的做法。在字符串中链接名称-错误的做法。这真的让这段代码的支持既痛苦又昂贵。谢谢你的建议。我正在使用Node.Js验证库,它促进了函数链接。我希望链接是基于某些参数的动态链接。上面的例子只是说明了我想要实现什么。@MeUnagi-其他插件(?)或示例代码如何处理相同的问题?例如,在Asp.net MVC验证中,这些是字符串和函数之间的清晰映射,您在这里描述的机制是自动完成的(包括参数)。我同意,我Unagi希望对现有代码进行更改以使其工作。“我正在尝试使用变量替换使javascript链接工作。”。在这种情况下,变量=动态。这是硬编码的。谢谢你闪电般的回复。对不起,我不太清楚我在找什么。函数链字符串根据特定条件动态构造。每个条件都向链接字符串添加函数。函数链可以是“one().two()”或“one().two().three()”。请大家在否决表决之前-这里的假设是我们可能将代码作为函数的参数,而不仅仅是字符串
“one-one-two-one”
var methods = ['next', 'child', 'parent'];

var element = methods.reduce(function(method){
    return $(selector)[method]();
});

console.log(element) //works! as all method names in methods array are applied and returned each iteration.