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