深入學(xué)習(xí)js的面向?qū)ο?/h2>

在之前的一篇文章的末尾我提到了JavaScript的對象創(chuàng)建方法,可以利用函數(shù),內(nèi)置對象和this等關(guān)鍵詞實(shí)現(xiàn)對象的創(chuàng)建。但是很遺憾,我最先接觸的面向?qū)ο蟮木幊陶Z言是java,因而對于這些實(shí)現(xiàn)面向?qū)ο蟮姆椒ú⒎亲约旱氖走x。下面是那篇文章:
記一次兩小時(shí)的js編程學(xué)習(xí)

我們必須明白面向?qū)ο蟮木唧w含義,尤其對于JavaScript中來說,因?yàn)楹苊黠@它與其他語言中存在著較大的差別。JavaScript 提供多個(gè)內(nèi)建對象,比如 String、Date、Array 等等。

對象只是帶有屬性和方法的特殊數(shù)據(jù)類型。JavaScript中對象被當(dāng)做了特殊數(shù)據(jù)結(jié)構(gòu)struct,而一般的語言被當(dāng)做類的實(shí)例化。

  • 布爾型可以是一個(gè)對象。
  • 數(shù)字型可以是一個(gè)對象。
  • 字符串也可以是一個(gè)對象
  • 日期是一個(gè)對象
  • 數(shù)學(xué)和正則表達(dá)式也是對象
  • 數(shù)組是一個(gè)對象
  • 甚至函數(shù)也可以是對象
    一般的語言,都是利用類來創(chuàng)建對象,完成面向?qū)ο蟮倪^程。舉個(gè)最熟悉的java語言的例子:
Scanner input=new Scanner(System.in);
int num=input.function();
String num=input.var;

而JavaScript卻不同,這是由于JavaScript的設(shè)計(jì)本質(zhì)上是一種面向過程的語言。雖然JavaScript如今早已演變成一種面向?qū)ο蟮恼Z言,卻也不使用類來創(chuàng)建對象。

直到2015年6月的ES6,OOP被標(biāo)準(zhǔn)化。舉個(gè)例子:

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;  
  }
}

這里有一個(gè)很嚴(yán)肅的問題,即類的擴(kuò)展,在js中來說就是對象屬性和方法的擴(kuò)展。java中有繼承extends來實(shí)現(xiàn)對父類的繼承。但JavaScript中卻根本沒有類的概念,就只能另尋它法完成擴(kuò)展和繼承。

在JavaScript中,當(dāng)一個(gè)對象已經(jīng)被實(shí)例化,如果我想想讓它擁有新的方法和屬性就需要借用關(guān)鍵字prototype。舉個(gè)例子:

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è)置新的顏色,需要利用沒有實(shí)例化之前的Car,再借用關(guān)鍵詞prototype才可以完成添加屬性和新方法的操作。

除了擴(kuò)展,我們還需要繼承,JavaScript依舊使用prototype關(guān)鍵詞完成繼承的操作。

function Pet(){
  this.animal="pet"
  this.name="ahhh"
}
function Cat(){
  this.age=2
}
//接下來就是讓Cat這個(gè)類擁有Pet類的屬性和方法的操作
Cat.prototype=new Pet()  //給Cat類加上Pet類的全部屬性和方法

為什么說上面的Cat和Pet是類,如同java,我們默認(rèn)類的首字母大寫。JavaScript使用函數(shù)面向?qū)ο蟮暮锰幵谟诳梢栽诤瘮?shù)中添加眾多的變量和函數(shù)。內(nèi)置的Object()過于簡單。

推薦閱讀:
記一次兩小時(shí)的js編程學(xué)習(xí)

個(gè)人博客十八
歡迎大家交流博客,我擅長串改大佬們寫的源碼喲!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容