Javascript 在jQuery中使用字符串调用嵌套对象函数
我有这样一个代码,它本身运行得非常好:Javascript 在jQuery中使用字符串调用嵌套对象函数,javascript,jquery,object,Javascript,Jquery,Object,我有这样一个代码,它本身运行得非常好: var Person = { getName: function() { alert("Johnny"); } }; var myContext = "Person"; var theCodeToExecute = myContext + ".getName()"; var theFunctionItself = new Function(theCodeToExecute); theFunctionItself();
var Person = {
getName: function() {
alert("Johnny");
}
};
var myContext = "Person";
var theCodeToExecute = myContext + ".getName()";
var theFunctionItself = new Function(theCodeToExecute);
theFunctionItself();
但当我把它放在jQuery中时,它就停止工作了
$(document).ready(function() {
//Where the code should be.
});
我知道已经回答了非常类似的问题,但没有一个解决了这个精确的问题
编辑:
谢谢大家的回答。我想我把我的问题缩得太窄了,以至于我的意图很不清楚。以下是我试图实现的目标的更清晰版本:
var Road = {
House: function(color, size, neighbor){
this.color = color;
this.size = size;
this.neighbor = neighbor;
}
};
Road.House.prototype.getSize = function() {
alert(this.size);
};
Road.House.prototype.getNeighborSize = function() {
var theNeighbor = this.neighbor;
var codeToExecute = theNeighbor + ".getSize()";
var tmpFunc = new Function(codeToExecute);
tmpFunc(); //this only works when outside of jQuery.
};
var house1 = new Road.House("blue", "small", "house2");
var house2 = new Road.House("red", "huge", "house3");
house1.getNeighborSize(); //this successfully returns "huge" when outside of jQuery.
同样,它本身工作得非常好,但在jQuery中不起作用,我需要它在jQuery中工作,因为我的函数的最终版本将使用大量jQuery代码。再次感谢
上次编辑:
谢谢菲利克斯的帮助。似乎还有最后一个问题。我只能得到邻居的大小,如果邻居是在我查询的房子之前声明的
var house1 = new Road.House("red", "big", house2);
var house2 = new Road.House("blue", "huge", house3);
var house4 = new Road.House("blue", "small", house4);
var house3 = new Road.House("blue", "little", house1);
house1.getNeighborSize(); //this doesn't work.
house3.getNeighborSize(); //this works
再次感谢 使用
新函数创建函数时,它将在全局范围内创建。
也就是说,它无法访问您在ready
回调中创建的变量
// global scope
$(document).ready(function() {
// ready callback scope
});
引用此处的黄色大框:
注意:使用函数
构造函数创建的函数不会为其创建上下文创建闭包;它们始终在全局范围内创建。运行它们时,它们将只能访问自己的局部变量和全局变量,而不能访问调用函数构造函数的作用域中的变量。这不同于将eval
与函数表达式的代码一起使用
解决方案:
在全局范围内创建Person
使用eval
代替新功能
最好的是:
不要动态计算代码。您可以直接编写Person.getName()
李>
即使您认为必须对代码进行评估,您可能也不会,但如果您不解释您真正想要实现的目标,我们也无法帮助您找到替代方案
实际上,解决问题的方法不是尝试动态引用变量,而是将对邻居的引用传递给构造函数:
var house2 = new Road.House("red", "huge");
var house1 = new Road.House("red", "huge", house2);
然后函数看起来像
Road.House.prototype.getNeighborSize = function() {
if (this.neighbor) {
this.neighbor.getSize();
}
};
如果无法在构建时将引用传递给邻居,则可以创建setter:
Road.House.prototype.setNeighbor = function(neighbor) {
this.neighbor = neighbor;
};
使用新建函数创建函数时,将在全局范围内创建该函数。
也就是说,它无法访问您在ready
回调中创建的变量
// global scope
$(document).ready(function() {
// ready callback scope
});
引用此处的黄色大框:
注意:使用函数
构造函数创建的函数不会为其创建上下文创建闭包;它们始终在全局范围内创建。运行它们时,它们将只能访问自己的局部变量和全局变量,而不能访问调用函数构造函数的作用域中的变量。这不同于将eval
与函数表达式的代码一起使用
解决方案:
在全局范围内创建Person
使用eval
代替新功能
最好的是:
不要动态计算代码。您可以直接编写Person.getName()
李>
即使您认为必须对代码进行评估,您可能也不会,但如果您不解释您真正想要实现的目标,我们也无法帮助您找到替代方案
实际上,解决问题的方法不是尝试动态引用变量,而是将对邻居的引用传递给构造函数:
var house2 = new Road.House("red", "huge");
var house1 = new Road.House("red", "huge", house2);
然后函数看起来像
Road.House.prototype.getNeighborSize = function() {
if (this.neighbor) {
this.neighbor.getSize();
}
};
如果无法在构建时将引用传递给邻居,则可以创建setter:
Road.House.prototype.setNeighbor = function(neighbor) {
this.neighbor = neighbor;
};
好的,如果您试图调用一个方法,这里有一些错误。您应该避免像Felix提到的那样动态评估Javascript。首先,我将从正确的代码开始,假设您只想调用getName方法
$(document).ready(function() {
var Person = {
getName: function() {
alert("Johnny");
}
};
Person.getName();
});
您不需要将Person重新分配给新变量,您可以直接在此处访问它。您还将Person放在引号中,这意味着您的myContext变量引用了一个带有单词“Person”的字符串
现在,我认为您实际上想要做的是,使用new来构建一个构造函数
以下是实际操作方法:
$(document).ready(function () {
//You need to make it a function that returns an object
var Person = function (name) {
return {
getName: function () {
alert(name);
}
}
};
//Then we create an instance of Person and pass in the name as an argument
var johnny = new Person('Johnny');
johnny.getName();
});
您将看到,我们没有将Person设置为对象,而是将其设置为返回对象的函数,并使用函数参数作为名称的占位符。这样我们就可以创造出我们想要的任意多的人,而不必每次都重新定义人。例如,如果我们想培养更多的人,我们只需要:
var sam = new Person('Sam');
var jim = new Person('Jim');
现在sam.getName()将向“sam”发出警报,jim.getName()将向“jim”发出警报。好的,如果您试图调用一个方法,这里会出现一些错误。您应该避免像Felix提到的那样动态评估Javascript。首先,我将从正确的代码开始,假设您只想调用getName方法
$(document).ready(function() {
var Person = {
getName: function() {
alert("Johnny");
}
};
Person.getName();
});
您不需要将Person重新分配给新变量,您可以直接在此处访问它。您还将Person放在引号中,这意味着您的myContext变量引用了一个带有单词“Person”的字符串
现在,我认为您实际上想要做的是,使用new来构建一个构造函数
以下是实际操作方法:
$(document).ready(function () {
//You need to make it a function that returns an object
var Person = function (name) {
return {
getName: function () {
alert(name);
}
}
};
//Then we create an instance of Person and pass in the name as an argument
var johnny = new Person('Johnny');
johnny.getName();
});
您将看到,我们没有将Person设置为对象,而是将其设置为返回对象的函数,并使用函数参数作为名称的占位符。这样我们就可以创造出我们想要的任意多的人,而不必每次都重新定义人。例如,如果我们想培养更多的人,我们只需要:
var sam = new Person('Sam');
var jim = new Person('Jim');
现在sam.getName()将向“sam”发出警报,jim.getName()将向“jim”发出警报。您可能需要发布一个JSFIDLE来说明这个问题