zoukankan      html  css  js  c++  java
  • Javascript对象的方法赋值

    Javascript对象编程学习中,一直不能很好的掌握对象的属性(property)和方法(method)。今天在写代码过程中,又犯了一个低级错误。

    <!DOCTYPE html>
    <html>
        <head>
            <meta charset="utf-8"/>
            <title>Javascript对象的方法</title>
        </head>
        <body>
        <p>
        通过自定义一个球的对象。在页面加载完成时,在canvas上绘制一个球。
        </p>
        <canvas id="mycanvas" width="400" height="300">
        您的浏览器不支持HTML5 Canvas标签。
        </canvas>
        <script type="text/javascript">
        var ctx;
        function Ball(sx,sy,rad,styleString){
            this.sx=sx;
            this.sy=sy;
            this.rad=rad;
            this.fillStyle=styleString;
            this.draw=drawball();
            this.moveit=moveball();
        }
        function drawball(){
            ctx.fillStyle=this.fillStyle;
            ctx.beginPath();
            ctx.arc(this.sx,this.sy,this.rad,0,Math.PI*2,true);
            ctx.fill();
        }
        function moveball(){
            //todo
        }
        var aball=new Ball(100,100,10,"rgb(234,20,200)");
        function init(){
            var canvas=document.getElementById("mycanvas");
            ctx=canvas.getContext("2d");
            aball.draw();
        }
        window.addEventListener("load",init,false);
        </script>
        </body>
    </html>

    image自己想这个方法在init()函数里面调用,ctx怎么会为”undefined”,不可能。监听事件不会出错呀。那问题说明这个函数在init()之前就运行了。断点跟踪就证明自己猜想是对的,但是这是一个对象,我只是new一下,不可能回去调用它的方法呀!并且drawball()方法也是在init()函数里面调用的。仔细一行一行的看代码,看到底哪里出了问题。最后发现下面两行很低级错误的代码,它们是:

    this.draw=drawball(); this.moveit=moveball();

     

    本意是在自定义对象里面,给对象一个方法。我给了它方法,但是后面的()会马上调用这个方法。这是不应该的。this.draw指向一个函数的地址,但是在这里不需要马上调用它。所以在函数init()还没有进行时,这个drawball()函数就开始运行了。所以此时的ctx确实为undefined。

    正确的做法是把方法的名字赋值给对象的方法。代码改为下面就正常运行:

    this.draw=drawball; 
    this.moveit=moveball;

     

    运行结果如下:

    image

    参考网址:

    http://www.w3school.com.cn/js/js_objects.asp

    http://www.ruanyifeng.com/blog/2010/05/object-oriented_javascript_encapsulation.html

  • 相关阅读:
    [Java]获取控制台输入
    数据库行锁实验二,两个同表删除操作不存在交集而不会死锁
    数据库行锁实验一:两个删除操作处理的记录存在交集则会死锁
    Java里如何将一个字符串重复n次
    【json/regex】将嵌套对象生成的json文进行内部整形排序后再输出
    【json/regex】将简单对象生成的json文进行内部排序后再输出
    【maven】在pom.xml中引入对json-lib的依赖dependency
    (转载)使用json-lib进行Java和JSON之间的转换
    【JDBC】仅输入表名和要插入的记录数,自动检测表的字段和类型,然后插入数据的全自动程序(Oracle版)
    【Java/Csv/Regex】用正则表达式去劈分带引号的csv文件行,得到想要的行数据
  • 原文地址:https://www.cnblogs.com/liminjun88/p/3176862.html
Copyright © 2011-2022 走看看