var box = {"name":"陌兮", "run":function(){ alert("我这函数是box里面的run的"); }}var box2 = box.run(); 首先说一下我对js中对象的理解吧。Js中的对象内部可以定义属性,也可以定义函数。这和java比起来相当于什么?对!没错,就相当于类!js中是没有类的,所以我理解的是js中的对象就相当于java中的类。既然js的对象相当于java中的类。那么java中的内部类,Js能用吗?想到这一步,我马上就开始尝试:var box = { "run":function(){ alert("我这函数是box里面的run的"); }, "boxInner":{ "runInner":function(){ alert("我是box对象里面的run方法里面的boxInner对象里面的runInner方法!"); } }}var box2 = box.run();var box3 = box.boxInner.runInner(); 可以看见,在box对象中我又定义了一个boxInner对象,并且在boxInner对象中还定义了一个runInner()的方法。强大的Js果真和预料中一样,完全可以运行!思维不可遏止了!这时候,我就在想,既然内部类可以在Js中使用,那么我想要到function中定义对象(类)呢?那可不可以通过某种方法将function中的对象进行调用,从而让代码的复杂度更加高大上呢?于是我就写下了如下的代码:var box = { "run":function(){ alert("我这函数是box里面的run的"); var boxInner = { "runInner":function(){ alert("我是box对象里面的run方法里面的boxInner对象里面的runInner方法!"); }, }; }}var box2 = box.run();var box3 = box.run().boxInner.runInner(); 可是结果很失望,运行box.run()是很正常的。但是运行到box.run().boxInner.runInner()的时候就报了null或undefined错误了。其实一看也就明白,这种直接调用的方法肯定不行,因为run()并没有返回什么值,更不用说由此来获得boxInner对象了。但是思维怎么可能就这样被打断!出现这种问题的原因,不就是无法获得run()这个function的对象吗?(知道function不是对象的我已经泪流满面)于是乎,我第一反应就是按照java的思维使用反射获得run()对象了,你无法给我返回run(),我拿起铲子把你挖出来,哈哈!于是乎,百度查了一小会儿,得知了js反射原来如此简单,代码如下:var box = { "run":function(){ alert("我这函数是box里面的run的"); var boxInner = { "runInner":function(){ alert("我是box对象里面的run方法里面的boxInner对象里面的runInner方法!"); }, }; }}var box2 = box.run();var box3 = box.run().boxInner.runInner();//若是要执行这段代码,就必须要使得box.run()返回一个对象,//并且这个对象还是这个方法本身。在这里就必须使用反射机制来获取当前对象的方法的对象了for(var p in box){ if(typeof(box[p]) == "function"){ //box[p](); var out = box[p]; alert(typeof out); for(var i in out){ alert("进入了函数"); out[i].runInner(); } }} 然而结果又再次地打击了我!将所得到的box[p]弹出来,我发现tm根本还是function呀!!!java中不是可以获得对象吗?坑!到了这地步,我终于发现了,js中对像和java中的类果真近乎一样,就连在方法中定义的内部对象(java内部类)都近乎一样。因为,安装上面的写法,我是可以在函数中定义对象的,但是该对象的作用域,或是说的直接点,该对象只能服务于该函数,不可跳出(外面根本就得不到该对象!)。总结:
刚刚开始学习Js,对比与java,js给我的感觉就是java的另一种形式,或是说,都有面向对象的思维吧。对于以上浅薄的认知,还望各位大神能够批评指正,在下感激不尽。如果有什么意见或是不懂之处,还望能够和我交流探讨,但愿我粗浅的知识能够帮助到您,更愿大家一同进步,让js在我们手中也能够随笔生花!
新闻热点
疑难解答