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呀?。。ava中不是可以獲得對象嗎?坑!到了這地步,我終于發現了,js中對像和java中的類果真近乎一樣,就連在方法中定義的內部對象(java內部類)都近乎一樣。因為,安裝上面的寫法,我是可以在函數中定義對象的,但是該對象的作用域,或是說的直接點,該對象只能服務于該函數,不可跳出(外面根本就得不到該對象!)。總結:
剛剛開始學習Js,對比與java,js給我的感覺就是java的另一種形式,或是說,都有面向對象的思維吧。對于以上淺薄的認知,還望各位大神能夠批評指正,在下感激不盡。如果有什么意見或是不懂之處,還望能夠和我交流探討,但愿我粗淺的知識能夠幫助到您,更愿大家一同進步,讓js在我們手中也能夠隨筆生花!
新聞熱點
疑難解答