gpt4 book ai didi

javascript - 是否可以使用字符串从对象调用方法?

转载 作者:搜寻专家 更新时间:2023-11-01 04:10:25 25 4
gpt4 key购买 nike

是否可以使用字符串从对象调用方法?

var elem = $('#test');             //<div id="test"></div>
var str = "attr('id')";

//This is what I'm trying to achieve
elem.attr('id'); //test

//What I've tried so far
elem.str; //undefined
elem.str(); //Object [object Object] has no method 'str'
var fn = eval(str); //attr is not defined
eval(elem.toString()+'.'+str); //Unexpected identifier

//Only solution I've found so far,
//but is not an option for me
//because this code is in a function
//so the element and method call
//get passed in and I wouldn't know
//what they are
eval($('#test').attr('id')); //test

最佳答案

更新

这是我最终的有效答案:
在控制台中运行这段代码之后

theMethod = 'attr("id","foo")'.match(/^([^(]+)\(([^)]*)\)/);
jQuery('#post-form')[theMethod[1]].apply(jQuery('#post-form'),JSON.parse('['+theMethod[2]+']'));

post-form 元素现在有一个新的 ID,完全没有问题。这适用于采用多个参数、单个参数或根本没有参数的方法。回顾:

theMethod = theInString.match(/^\.?([^(]+)\(([^)]*)\)/);
//added \.? to trim leading dot
//made match in between brackets non-greedy
//dropped the $ flag at the end, to avoid issues with trailing white-space after )
elem[theMethod[1]].apply(elem,JSON.parse('['+theMethod+']'));

这是我能想到的最安全、最可靠的方法,真的


无论你做什么不要使用 EVAL:

var theMethod = 'attr(\'id\')';
//break it down:
theMethod = theMethod.match(/^([^(]+)\(.*?([^)'"]+).*\)$/);
//returns ["attr('id')", "attr", "id"]
elem[theMethod[1]](theMethod[2]);//calls the method

这与您对任何 对象使用的基本原则相同(请记住,函数在 JS 中都是独立的对象 - 而 jQuery 对象也是对象)。这意味着可以使用与访问属性完全相同的方式访问方法:

$('#foo').attr('id') === $('#foo')['attr']('id');

因此,只需将字符串分开,并像使用对象属性一样使用方法名称,一切就绪。

请记住:当您只有 eval 锤子时,一切看起来都像您的拇指。
布伦丹·艾希


如果有可能将多个参数传递给任何方法,您也可以解决这个问题(我认为 - 好吧:逻辑决定了,但已经很晚了,逻辑被 Gin 漂亮地打败了现在不好):

theMethod = theMethod.match(/^([^(]+)\(([^)]+)\)$/);
//["attr('id','foo')", "attr", "'id','foo'"] --> regex must now match quotes, too
elem.theMethod[1].apply(elem,JSON.parse('['+theMethod[2]+']'));

这会将您正在处理的任何元素/对象的方法应用于自身,因此不会更改调用者上下文(this 仍将指向方法中的对象)并且它传递一个数组将传递给被调用方法的参数。

关于javascript - 是否可以使用字符串从对象调用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12166642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com