我需要一些JavaScript函数来知道自己的名字,包括它们所包含的对象。我似乎找不到办法做到这一点。 SO上的所有示例都不太适合我的用例。这是我正在寻找的小提琴:http://jsfiddle.net/amczpro7/5/
window.myMainNameSpace = {};
myMainNameSpace.y = {
z: function(funcToCall) {
var x = eval("new " + funcToCall);
}
}
myMainNameSpace.a = {
b: function(args) {
alert('I want to alert: myMainNameSpace.a.b');
/*
var myName = arguments.callee.toString();
myName = myName.substr('function '.length);
myName = myName.substr(0, myName.indexOf('('));
alert(myName);
console.log(arguments.callee);
console.log(this.constructor);
console.log(this.name);
console.log(this);
console.log(this.constructor.toString());
*/
}
}
myMainNameSpace.y.z('myMainNameSpace.a.b({arg1:123})');
我希望能够创建一个返回myMainNameSpace.a.b
或myMainNameSpace.a.b()
的函数,以便将它放在少数函数中。这可能吗?谢谢!
答案 0 :(得分:0)
你可以在没有eval的情况下完成它,你只需要迭代每个字母,直到达到aimSign。在每次迭代中,您将一个新对象放在最后一个嵌套对象中:
function callObjTail(obj){
var lastObj;
var lastSign;
for(var i='a'.charCodeAt(); true; i++){
console.log(i);
if(obj[String.fromCharCode(i)]){
lastObj = obj;
lastSign = i;
obj = obj[String.fromCharCode(i)];
}
else{
break;
}
}
if(lastObj){
lastObj[String.fromCharCode(lastSign)]();
}
else{
obj[Object.keys(obj)[0]]();
}
}
function buildObj(aimSign){
var obj = {};
var head = obj;
var nests = '';
for(var i='a'.charCodeAt(); i < aimSign.charCodeAt(); i++){
obj[String.fromCharCode(i)] = {};
obj = obj[String.fromCharCode(i)];
}
return { head : head, tail: obj };
}
var obj = buildObj('e');
console.log(obj.head); // { a: { b: { c: { d: {}}}}
console.log(obj);
obj.tail.e = function(){ console.log('tail called');};
console.log(obj.head.a.b.c.d.e());
console.log(obj.tail.e());
// call tail at the end
callObjTail(obj.head);
callObjTail(obj.tail);