摘要:字符串也可以是一個對象日期是一個對象數(shù)學和正則表達式也是對象數(shù)組是一個對象甚至函數(shù)也可以是對象一般的語言,都是利用類來創(chuàng)建對象,完成面向?qū)ο蟮倪^程。
在之前的一篇文章的末尾我提到了JavaScript的對象創(chuàng)建方法,可以利用函數(shù),內(nèi)置對象和this等關(guān)鍵詞實現(xiàn)對象的創(chuàng)建。但是很遺憾,我最先接觸的面向?qū)ο蟮木幊陶Z言是java,因而對于這些實現(xiàn)面向?qū)ο蟮姆椒ú⒎亲约旱氖走x。下面是那篇文章:
記一次兩小時的js編程學習
我們必須明白面向?qū)ο蟮木唧w含義,尤其對于JavaScript中來說,因為很明顯它與其他語言中存在著較大的差別。JavaScript 提供多個內(nèi)建對象,比如 String、Date、Array 等等。
對象只是帶有屬性和方法的特殊數(shù)據(jù)類型。JavaScript中對象被當做了特殊數(shù)據(jù)結(jié)構(gòu)struct,而一般的語言被當做類的實例化。
布爾型可以是一個對象。
數(shù)字型可以是一個對象。
字符串也可以是一個對象
日期是一個對象
數(shù)學和正則表達式也是對象
數(shù)組是一個對象
甚至函數(shù)也可以是對象
一般的語言,都是利用類來創(chuàng)建對象,完成面向?qū)ο蟮倪^程。舉個最熟悉的java語言的例子:
Scanner input=new Scanner(System.in); int num=input.function(); String num=input.var;
而JavaScript卻不同,這是由于JavaScript的設(shè)計本質(zhì)上是一種面向過程的語言。雖然JavaScript如今早已演變成一種面向?qū)ο蟮恼Z言,卻也不使用類來創(chuàng)建對象。
直到2015年6月的ES6,OOP被標準化。舉個例子:
function Car(Color,Year,Make,Miles){ this.color=Color; this.year=Year; this.make=Make; this.odometerReading=Miles; this.setOdometer=function(newMiles){ this.odometerReading=newMiles; } }
這里有一個很嚴肅的問題,即類的擴展,在js中來說就是對象屬性和方法的擴展。java中有繼承extends來實現(xiàn)對父類的繼承。但JavaScript中卻根本沒有類的概念,就只能另尋它法完成擴展和繼承。
在JavaScript中,當一個對象已經(jīng)被實例化,如果我想想讓它擁有新的方法和屬性就需要借用關(guān)鍵字prototype。舉個例子:
function Car(color){ this.color=color } var car=new Car("red") console.log(car.color) // car.length=5 // car.setColor("green") Car.prototype.length=5 Car.prototype.setColor=function(newColor){ this.color=newColor } console.log(car.length) car.setColor("green") console.log(car.color) ----------------------------------------------------- red 5 green [Done] exited with code=0 in 0.206 seconds
我們需要給car加上長度和設(shè)置新的顏色,需要利用沒有實例化之前的Car,再借用關(guān)鍵詞prototype才可以完成添加屬性和新方法的操作。
除了擴展,我們還需要繼承,JavaScript依舊使用prototype關(guān)鍵詞完成繼承的操作。
function Pet(){ this.animal="pet" this.name="ahhh" } function Cat(){ this.age=2 } //接下來就是讓Cat這個類擁有Pet類的屬性和方法的操作 Cat.prototype=new Pet() //給Cat類加上Pet類的全部屬性和方法
為什么說上面的Cat和Pet是類,如同java,我們默認類的首字母大寫。JavaScript使用函數(shù)面向?qū)ο蟮暮锰幵谟诳梢栽诤瘮?shù)中添加眾多的變量和函數(shù)。內(nèi)置的Object()過于簡單。
推薦閱讀:
記一次兩小時的js編程學習
個人博客十八
歡迎大家交流博客,我擅長串改大佬們寫的源碼喲!
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/95720.html
摘要:設(shè)計模式是以面向?qū)ο缶幊虨榛A(chǔ)的,的面向?qū)ο缶幊毯蛡鹘y(tǒng)的的面向?qū)ο缶幊逃行┎顒e,這讓我一開始接觸的時候感到十分痛苦,但是這只能靠自己慢慢積累慢慢思考。想繼續(xù)了解設(shè)計模式必須要先搞懂面向?qū)ο缶幊?,否則只會讓你自己更痛苦。 JavaScript 中的構(gòu)造函數(shù) 學習總結(jié)。知識只有分享才有存在的意義。 是時候替換你的 for 循環(huán)大法了~ 《小分享》JavaScript中數(shù)組的那些迭代方法~ ...
摘要:是完全的面向?qū)ο笳Z言,它們通過類的形式組織函數(shù)和變量,使之不能脫離對象存在。而在基于原型的面向?qū)ο蠓绞街?,對象則是依靠構(gòu)造器利用原型構(gòu)造出來的。 JavaScript 函數(shù)式腳本語言特性以及其看似隨意的編寫風格,導致長期以來人們對這一門語言的誤解,即認為 JavaScript 不是一門面向?qū)ο蟮恼Z言,或者只是部分具備一些面向?qū)ο蟮奶卣?。本文將回歸面向?qū)ο蟊疽猓瑥膶φZ言感悟的角度闡述為什...
摘要:我們用一張圖表示構(gòu)造函數(shù)和實例原型之間的關(guān)系好了構(gòu)造函數(shù)和實例原型之間的關(guān)系我們已經(jīng)梳理清楚了,那我們怎么表示實例與實例原型,也就是或者和之間的關(guān)系呢。 開篇: 在Brendan Eich大神為JavaScript設(shè)計面向?qū)ο笙到y(tǒng)的時候,借鑒了Self 和Smalltalk這兩門基于原型的語言,之所以選擇基于原型的面向?qū)ο笙到y(tǒng),并不是因為時間匆忙,它設(shè)計起來相對簡單,而是因為從一開始B...
摘要:我們用一張圖表示構(gòu)造函數(shù)和實例原型之間的關(guān)系好了構(gòu)造函數(shù)和實例原型之間的關(guān)系我們已經(jīng)梳理清楚了,那我們怎么表示實例與實例原型,也就是或者和之間的關(guān)系呢。 開篇: 在Brendan Eich大神為JavaScript設(shè)計面向?qū)ο笙到y(tǒng)的時候,借鑒了Self 和Smalltalk這兩門基于原型的語言,之所以選擇基于原型的面向?qū)ο笙到y(tǒng),并不是因為時間匆忙,它設(shè)計起來相對簡單,而是因為從一開始B...
閱讀 4058·2021-09-24 10:24
閱讀 1410·2021-09-22 16:01
閱讀 2729·2021-09-06 15:02
閱讀 1031·2019-08-30 13:01
閱讀 1018·2019-08-30 10:52
閱讀 644·2019-08-29 16:36
閱讀 2248·2019-08-29 12:51
閱讀 2348·2019-08-28 18:29