Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在jQuery中使用字符串调用嵌套对象函数_Javascript_Jquery_Object - Fatal编程技术网

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来说明这个问题