问题描述
- Javascript中类的new和类返回this的问题
-
使用Javascript创建两个类
function RectF(x, y, w, h) {
this.X = x;
this.Y = y;
this.Width = w;
this.Height = h;
...
}
function PointF(x, y) {
this.X = x;
this.Y =y;
}
使用时我想像C语言那样传参数进去:
int ret = isin(RectF(10,10,10,10), PointF(2,19));
结果不敢想像!为什么?因为上面使用的只是多重函数嵌套调用,根本没有类!然而这两个function没有返回值,
传给isin的两个参数都是undefined!
应该这样调用int ret = isin(new RectF(10,10,10,10), new PointF(2,19));
不过我试着在两个类的最后添加上reurn this;结果就正确了!
所以问题来了:使用return this返回的究竟是什么?难道返回this和加new是一样的效果吗?那么返回this会对内存有分配吗?
解决方案
function PointF(x, y) {
this.X = x;
this.Y =y;
}
如果直接调用即var p= PointF(x, y) ;此时函数中this,代表全局变量对象,也就是window,其中,x、y为全局变量,你可以通过window.x访问x。也可以直接输出x、y。
如果通过var p=new PointF(x, y) ;此时函数中this,代表的是构造函数PointF创建的对象,其中x,y为局部变量。
如果你想通过var p= PointF(x, y) ;调用,并且创建一个新的对象。你可以改写PointF函数如下
function PointF(x,y){
var o=new Object();
o.x=x;
o.y=y;
return o;
}
关于JS对象创建,详细信息,你可以参考http://blog.csdn.net/hsd2012/article/details/50978425这个。
解决方案二:
正确的做法是使用prototype
http://blog.csdn.net/zhoutaohenan/article/details/8641551
解决方案三:
this是指向調用此函數的運行環境的對象(與引用差別很大).new 是通過構造函數方法創建一個類似與創建類對象的數據對象.既然產生新的對象,并產生對對象引用的值傳遞,肯定會涉及分配內存.至於上面所說的prototype,其實正確的是和普通構造函數一起搭配使用才是正確的模式.不過其也具備很大限制條件
解决方案四:
int ret = isin(new RectF(10,10,10,10), new PointF(2,19));
这样写不需要再RectF中return this,直接就是RectF的实例了,默认就会return this,没有new则是调用函数,如果没有return语句,那么默认就是return undefined
解决方案五:
javascript中的this问题
javascript对象中this问题
Java 类.this含义与.new