Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.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 OOP-对象如何调用其实例方法?_Javascript_Oop - Fatal编程技术网

Javascript OOP-对象如何调用其实例方法?

Javascript OOP-对象如何调用其实例方法?,javascript,oop,Javascript,Oop,我用OOP编写了我的第一个Javascript。我试图从同一对象中的另一个方法调用它的实例方法 当我调用下面这样的begin()方法时,它在关闭对话框后被激发,我得到“this.after()不是函数”。 如果其他语言像Java一样,它应该只是处理而没有任何问题。 我有什么遗漏吗 我将jQuery bind()用于对话框关闭事件,所以“this”必须指向非类本身 function MyHandler() { this.begin = function() { $

我用OOP编写了我的第一个Javascript。我试图从同一对象中的另一个方法调用它的实例方法

当我调用下面这样的begin()方法时,它在关闭对话框后被激发,我得到
“this.after()不是函数”。

如果其他语言像Java一样,它应该只是处理而没有任何问题。 我有什么遗漏吗

我将jQuery bind()用于对话框关闭事件,所以“this”必须指向非类本身

function MyHandler() {

    this.begin = function() {
            $("#hiddenIframe").dialog({
                autoOpen: true,
                height: 300,
                width: 300
            });


            $("#hiddenIframe").bind("dialogclose", function() {
                this.after();
            });
    }

    this.after = function() {
        //do something here
    }
}

var myInstance = new MyHandler();
myInstance.begin(); //error: this.after() is not function ???

jQuery将在上下文中执行的绑定函数绑定到它们绑定的内容

在事件侦听器中,您有
#hiddenIframe
作为

您可能希望将指向实例的指针存储在某个变量中,然后在实例本身以外的上下文中使用它。

尝试以下操作:

function MyHandler() {

    var thisInstance = this;

    this.begin = function() {
        $("#hiddenIframe").bind("dialogclose", function() {
             thisInstance.after();
        });
    }

    this.after = function() {
        //do something here
    }
}

谢谢你,多汁的编剧。我不知道jquery
dialog
如何调用
dialogclose
事件处理程序,但描述的错误表明调用匿名函数的上下文与
this.after()有关里面不是
MyHandler
,而
这个
在那里意味着其他东西。为了明确说明
之后的
是谁的方法,请在
MyHandler
构造函数中定义局部变量,并在需要在未知上下文中调用的函数中调用
MyHandler
实例方法时使用此变量。

我认为您的代码没有任何问题。它起作用了
还有另一种表示相同对象的简单方法,即JSON形式

请参阅下面的代码:

<script>
     var MyHandler= {
                begin:function() {
                    console.log('inside begin');
                    after();
                },
                after:function() {
                    alert('inside after');
                }
      };
     var myInstance = MyHandler;
     myInstance.begin();
</script>

var MyHandler={
开始:函数(){
log('insidebegin');
在()之后;
},
之后:函数(){
警觉(“内后”);
}
};
var myInstance=MyHandler;
myInstance.begin();
带有OOP java脚本函数的对话框代码:

<html>
<head>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3.2/jquery.min.js"></script>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jqueryui/1.7.1/jquery-ui.min.js"></script>
<link rel="stylesheet" href="http://jqueryui.com/themes/base/jquery.ui.all.css">
<script type="text/javascript">
function MyHandler() {
    this.begin = function() {       
            $("#info").show().dialog("open");
            $("#info").bind("dialogclose", function() {
                this.after();
            });             
    }
    this.after = function() {
            $("#info").dialog("destroy");
    }
}
function showDialog(){
    var myInstance = new MyHandler();
    myInstance.begin(); 
}
$(document).ready(function() {
   var info=$("#info");
   info.dialog({
           autoOpen: false,      
           height: 300,
           width: 300,
           title:'Hello Dialog',
           autoClose:false,
           closeOnEscape: true

       });
    $("a").click(showDialog);   
});
</script>
</head>
<body>
<a href="#" onclick="showDialog()">Show the Dialog</a>
<div id="info" style="display:none;font-size:10px;">
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</body>
</html>

函数MyHandler(){
this.begin=函数(){
$(“#信息”).show()对话框(“打开”);
$(“#info”).bind(“dialogclose”,function(){
这个;
});             
}
this.after=函数(){
$(“#信息”)。对话框(“销毁”);
}
}
函数showDialog(){
var myInstance=new MyHandler();
myInstance.begin();
}
$(文档).ready(函数(){
风险值信息=$(“#信息”);
信息对话框({
自动打开:错误,
身高:300,
宽度:300,
标题:'Hello Dialog',
自动关闭:错误,
closeOnEscape:真的
});
$(“a”)。单击(显示对话框);
});
知识产权是一种权利,是一种精英的权利,是劳动和财富的暂时性权利。

与Java完全不同,但您的代码示例仍然可以工作。如果调用
myInstance.after()而不是
myInstance.begin()?很抱歉,上面的示例有效。(我简化了一点代码,所以它一定是我所做的更改)我将编辑代码。我没有得到这个错误。还有更多的背景吗?您使用的是什么版本的JavaScript引擎?抱歉,伙计们,我修改了代码,现在它真的显示了错误。您的代码是正确的,但是可以添加一个解释说明它为什么工作。不仅解决问题,帮助他人理解和了解问题发生的原因以及未来如何处理类似问题请注意,这不是“上下文”(至少不是ECMA-262使用该术语的意思),而是一个关键字(本质上是局部变量),根据函数调用设置为特定值。在非严格模式下,它始终是一个对象,或者是函数作为其方法调用的对象,构造函数中使用new调用的新对象,调用或应用提供的对象,或者如果以上都没有,则是全局对象。对于由事件处理程序调用的侦听器,它被设置为其处理程序调用函数的元素。您修改了OP提供的代码,使其与原始代码完全不同,这就是它工作的原因抱歉,我的原始代码没有错误(因为我简化了它)。请参考当前代码。哦,这改变了一切,对不起。好的,mastaro san,如果你还没有,请看下面我发布的上面改进的代码。对不起,你的答案中没有看到最初的问题是如何变得如此复杂的,而这仅仅是
这个
的一个简单范围问题。