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的调试不方便性, 让这件事情变得更神秘。反正出错了就显示不正常。哈哈哈。这种逻辑相关的错误,要从逻辑设计的角度来找问题出现的可能点。