js编程中遇到的问题

javaScript是一种弱类型编程语言,所以在利用它大规模编程的时候,如果因为某些设计或操作失误出错,查找调试是一个比较痛苦的事情。

我在利用canvas做游戏的时候,主要有如下几个问题。

1.this

利用js写基于(类似)oop的代码,于是乎在一个"类"里面离不开this , 但是js的类或者对象里的this有时候不怎么听话(我现在也没弄明白为什么)。例如你在一个js类里面的一个方法(函数)里调用这个类的实例变量或者方法,就需要用到 this.name或this.getName(),但是有的时候这个this失效了(我没有在方法中创建方法),一失效,程序就不能正常执行,但这个错误不符合基本的编程规则,找起来也不好找。最后,我干脆在类里面建立一个临时变量,这样写: var _this = this;

当我需要使用this的时候,我直接使用_this,例如: _this.name或_this.getName();,这样就保证我不会出错。

 

2. 继承

继承举例

 /*    

本类作为所有显示对象的基类    
*/
function DispObject(){
    
    this.x = 0;
    this.y = 0;
    //
    this.width = 0;
    this.height = 0;
    // 是否可见
    this.visible = true;
    // 混合模式
    this.blendMode = "";    
    //
    this.alpha = 1.0;
    
    // 坐标转化: 从父级到子级
    this.parentToLocal = function(px,py){
        return {x:px - this.x,y:py - this.y};
    }
    // 坐标转化: 从子级到父级
    this.localToParent = function(px,py){
        return {x:px + this.x,y:py + this.y};
    }
};
//
//
RectShape.prototype = new DispObject();
RectShape.prototype.constructor = RectShape;

function RectShape(w,h){
    if(w == undefined || w == null){
        w = 0;
    }
    if(h == undefined || h == null){
        h = 0;
    }    
};

js中的oop是通过原型模拟的,所以在这里使用继承,你得小心。 如果一个类不会有子类,也就不会有继承,你随便 用new来产生实例是没问题的。当一个类需要被多次继承,以拓展工用,这时候你得类设计就得小心,而且在子类中创建实例如果只使用new 就很可能出错,错误的表现为(很可能是子类和父类使用同一份数据,或者多个实例会使用同一份数据) 。原因在于原型。过程是这样的,当你建立一个类的时候,你不可能全部是公开的方法或者属性(通过this.xx来定义),你需要一些私有的变量或方法,私有的变量或方法只能是临时(局部)变量或方法,在类中通过: var name = "vily";或 function init(){};来定义。当你的父类中有私用的东西的时候,你用new来创建子类,这很可能造成了,这两个实例共享这些私有数据。于是就出现错误。

解决方案是你不能用new来创建,你需要用一个方法来生成,例如

function createMovieClip(mc){
MovieClip.prototype = new DispContainer();
var pmc = new MovieClip();
if(mc!= undefined && mc!= null){
pmc.setBody(mc);
}
return pmc;
};

3.数组越界:

 数组越界是编程中的魔咒,很难摆脱。js的调试不方便性, 让这件事情变得更神秘。反正出错了就显示不正常。哈哈哈。这种逻辑相关的错误,要从逻辑设计的角度来找问题出现的可能点。

posted @ 2012-03-03 12:08  vily_雷  阅读(630)  评论(0)    收藏  举报