没有run窗口_学会了面向对象,还怕没有对象?
封裝
封裝創建對象的函數
封裝即把實現一個功能的代碼封裝到一個函數中,以后實現這個功能,只需要執行該函數即可。實現低耦合,高內聚。
現在我們把屬性和方法封裝成一個對象:
如果我們想創建一個不同性別不同姓名的對象,就需要再寫一遍上述代碼:
如果我們想要創建多個對象的話,寫起來就非常麻煩,所以要去封裝創建對象的函數解決代碼重復的問題。
然后生成實例對象,就等于是在調用函數:
上述過程可以類比為開工廠生產酸奶:第一步:需要原料;第二步:加工酸奶;第三步:出廠售賣;我們通過var聲明空對象的這一步就相當于第一步原料,添加屬性和函數就相當于第二步加工,通過return返回對象就相當于第三步出廠。這種符合上述1、2、3步驟的函數叫做工廠函數,這種設計函數的思路,叫做工廠設計模式。
通過new調用函數
官方函數創建對象的方法是通過new的方法,當我們不使用new創建對象的時候,函數內部的this會指向窗口。
所以當我們在函數內部給this.name賦值為xxxx時,可以通過window.name輸出xxxx,因為如果這個函數沒有主人的話它的主人就是window對象。
但是如果這個函數通過new運算符去調用,那么這個函數中的this,就會指向新創建的對象。
當我們通過new運算符去調用函數的時候,它首部和尾部會自動的生成以下兩步:1、原料操作:強制改變this指向this = new Object(); 3、出廠操作:將this返回return this;。
所以現在我們改造一下之前創建的函數,調用的時候全部都通過new去調用,并且將函數中的person改成this。
構造函數
我們把這種可以創建對象的函數,叫做構造函數。(功能就是用來構造對象)
為了和別的函數,進行區分,我們把構造函數首字母大寫。官方的構造函數:Array、Object、Date。
我們通過typeof可以看到官方通過new創建的Object、Array、Date本質上都是function函數。而且所有被該函數,創建的對象,對象的方法都是一套,arr1.push === arr2.push返回值是true。
但是通過調用函數生成的對象方法,彼此之間沒有聯系,不能反映出它們是同一個原型對象的實例。alert(p1.showName === p2.showName);返回值為false。
我們聲明兩個數組
給數組添加求和的函數
調用arr1.sum可以輸出arr1的和為150,但是調用arr2.sum會系統報錯,提示arr1.sum不是一個函數。因為arr1和arr2是單獨的兩個對象,給arr1添加一個方法,arr2并不會擁有這個方法。所以我們之前通過new調用函數生成對象后,他們的方法是相互獨立的。
每一個實例對象,都有自己的屬性和方法的副本。這不僅無法做到數據共享,也是極大的資源浪費。
原型prototype
prototype對象的引入:所有實例對象需要共享的屬性和方法,都放在這個對象中,那些不需要共享的屬性和方法,就放在構造函數中。以此來模擬類。所以想讓arr2也擁有求和函數就需要再重新寫一個arr2.sum,這樣就會造成浪費,我們想讓對象共用一個方法,這時候就需要引入原型prototype。在JS中一切皆對象,函數也是對象。 每一個被創建的函數,都有一個官方內置的屬性,叫做prototype(原型)對象 ,我們輸出一下show.protoype,得到結果[object Object]。
所有實例對象需要共享的屬性和方法,都放在這個對象里面;那些不需要共享的屬性和方法,就放在構造函數里面。
如果,我們想要讓該函數創建出來的對象,公用一套函數,那么我們應該將這套函數,添加該函數的prototype原型。 所以我們如果想讓兩個數組都擁有求和的方法,就需要將這個方法添加在Array的原型上。
現在arr1和arr2都可以使用這個函數,并且arr1.sum == arr2.sum,他們使用的這個函數都是原型上的同一個方法。
我們可以通過混合法,讓用戶自定義構造函數,封裝一個可以創建對象的函數,并且調用的是同一個方法。
面向對象編程案例
現在我們要測試100輛不同品牌的汽車,記錄他們在道路上行駛的性能指數。
創建一個可以構造各式各樣車的構造函數
在Car的原型上添加功能:讓車跑在路上,計算時速。
1. Car.prototype.run = function(road){2. alert(`一輛${this.type}品牌的${this.name}系列,時速為${this.speed}km/h的車,跑在長度為${road.length}km的${road.name},最終的成績是${road.length / this.speed}小時`);3. }創建一個可以構造各式各樣馬路的構造函數
添加第一個測試用例car1:
1. var kuahaidaqiao = new Road("跨海大橋總結
以上是生活随笔為你收集整理的没有run窗口_学会了面向对象,还怕没有对象?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 显示此文稿缺少字体_打开CAD图纸后,显
- 下一篇: 并发请求数_nginx如何限制并发连接和