偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

JavaScript是真正的OOP語言嗎?

開發(fā) 前端
JavaScript面向?qū)ο筮€是不面向?qū)ο螅@是個(gè)問題。好吧,這就是我們將要在這篇文章中討論的主題。每當(dāng)Java或C#或任何其他OOP語言的開發(fā)人員與JavaScript接觸時(shí),這些開發(fā)人員都會(huì)抱怨連連。他們說,用JavaScript工作簡(jiǎn)直是一團(tuán)亂,沒有類型,結(jié)構(gòu)不合理,有些怪異,對(duì)象支持不給力,它絕對(duì)不是OOP語言。

JavaScript面向?qū)ο筮€是不面向?qū)ο?,這是個(gè)問題。好吧,這就是我們將要在這篇文章中討論的主題。

[[205845]]

我知道,這個(gè)話題已經(jīng)被討論過太多次了。但是,它總是被不斷地提及。每當(dāng)Java或C#或任何其他OOP語言的開發(fā)人員與JavaScript接觸時(shí),這些開發(fā)人員都會(huì)抱怨連連。他們說,用JavaScript工作簡(jiǎn)直是一團(tuán)亂,沒有類型,結(jié)構(gòu)不合理,有些怪異,對(duì)象支持不給力,它絕對(duì)不是OOP語言。

其中有一些抱怨可能可以接受,但還有一些則是偏見,例如說JavaScript沒有類型因而它不是OOP語言的言論。關(guān)于后面一點(diǎn),在出口論斷之前,你應(yīng)該問自己:是什么使編程語言成為面向?qū)ο蟮木幊陶Z言?

什么是OOP?

OOP模式?jīng)]有正式的標(biāo)準(zhǔn)規(guī)范。沒有一個(gè)技術(shù)文檔定義了什么是OOP,什么不是OOP。OOP定義主要基于早期研究人員,如Kristen Nygaard, Alan Kays, William Cook等人發(fā)表的論文中的常識(shí)。已經(jīng)有很多人嘗試定義OOP以及一個(gè)可廣泛接受的定義來對(duì)編程語言進(jìn)行分類,因?yàn)槊嫦驅(qū)ο蠡趦蓚€(gè)要求:

通過對(duì)象建模問題的能力。

支持一些準(zhǔn)許模塊化和代碼重用的原則。

為了滿足***個(gè)要求,這種語言必須使開發(fā)人員能夠使用對(duì)象來描述現(xiàn)實(shí)并定義對(duì)象之間的關(guān)系,如下所示:

  • 關(guān)聯(lián):對(duì)象引用另一個(gè)獨(dú)立對(duì)象的能力。
  • 聚合:對(duì)象嵌入一個(gè)或多個(gè)獨(dú)立對(duì)象的能力。
  • 組合:對(duì)象嵌入一個(gè)或多個(gè)依賴對(duì)象的能力。

通常,如果語言支持以下原則,則能滿足第二個(gè)要求:

  • 封裝:專注于數(shù)據(jù)和操縱代碼的單一實(shí)體,并隱藏其內(nèi)部細(xì)節(jié)的能力。
  • 繼承:一個(gè)對(duì)象從一個(gè)或多個(gè)其他對(duì)象獲取某些或所有要素的機(jī)制。
  • 多態(tài):根據(jù)數(shù)據(jù)類型或結(jié)構(gòu)不同地處理對(duì)象的能力。

滿足這些要求的語言我們通常將其歸類為為面向?qū)ο蟮摹?/p>

JavaScript和OOP

所以現(xiàn)在我們知道OOP語言應(yīng)該是什么樣子的了。那么,我們可以證明JavaScript是一種OOP語言嗎?咱們?cè)囋嚢伞?/p>

我們知道,JavaScript對(duì)象支持關(guān)聯(lián),聚合和組合的能力并不強(qiáng)勁。請(qǐng)看以下代碼:

 

  1. var johnSmith = { 
  2.  firstName: "John"
  3.  lastName: "Smith"
  4.  address: { //Composition 
  5.  street: "123 Duncannon Street"
  6.  city: "London"
  7.  country: "United Kingdom" 
  8.  } 
  9. }; 
  10. var nickSmith = { 
  11.  firstName: "Nick"
  12.  lastName: "Smith"
  13.  address: { //Composition 
  14.  street: "321 Oxford Street"
  15.  city: "London"
  16.  country: "United Kingdom" 
  17.  } 
  18. }; 
  19. johnSmith.parent = nickSmith; //Association 
  20. var company = { 
  21.  name"ACME Inc."
  22.  employees: [] 
  23. }; 
  24. //Aggregation 
  25. company.employees.push(johnSmith); 
  26. company.employees.push(nickSmith); 

在上面的代碼中,你可以找到一個(gè)組合(address屬性)的示例,一個(gè)關(guān)聯(lián)(parent屬性)的示例和一個(gè)聚合(employees屬性)的示例。

至于封裝,JavaScript對(duì)象是支持?jǐn)?shù)據(jù)和函數(shù)的實(shí)體,但它們沒有高級(jí)的本地支持來隱藏內(nèi)部細(xì)節(jié)。JavaScript對(duì)象不關(guān)心隱私。如果不謹(jǐn)慎的話,所有的屬性和方法都可以公開訪問。但是,我們可以應(yīng)用若干技術(shù)來定義對(duì)象的內(nèi)部狀態(tài),并保護(hù)對(duì)象以防外部訪問:使用getter和setter來利用閉包。

通過所謂的原型繼承,JavaScript在基本層中支持繼承。即使有些開發(fā)人員認(rèn)為它有點(diǎn)簡(jiǎn)單,但JavaScript的繼承機(jī)制是完全有效的,并允許你得到與大多數(shù)公認(rèn)的OOP語言相同的結(jié)果。任憑你怎么想,JavaScript有一個(gè)機(jī)制,通過這個(gè)機(jī)制“一個(gè)對(duì)象從一個(gè)或多個(gè)其他對(duì)象獲取一些或所有的功能”,這就是繼承。

有多態(tài)性的挑戰(zhàn)似乎更加困難,因?yàn)樵S多人把這個(gè)概念與數(shù)據(jù)類型聯(lián)系起來。實(shí)際上,多態(tài)性涉及編程語言的許多方面,并且不僅僅是與OOP語言有關(guān)。通常它涉及諸如泛型、重載和結(jié)構(gòu)子類型等條目。所有這些對(duì)于一種“簡(jiǎn)單”和弱類型的語言——JavaScript——來說似乎不堪重負(fù)。然而事實(shí)并非如此:在JavaScript中,我們可以通過若干方式實(shí)現(xiàn)不同類型的多態(tài),也許我們?cè)诓恢挥X中已經(jīng)做過很多次了。

沒有類的OOP

“好吧,但話說回來,JavaScript沒有類。”

許多開發(fā)人員認(rèn)為JavaScript缺乏類的概念,而沒有將JavaScript視為一種真正的面向?qū)ο蟮恼Z言,因?yàn)樗粡?qiáng)制符合OOP原則。

但是,我們可以看到,在非正式的定義中,并沒有明確提及類。誠(chéng)然,對(duì)象需要特性和原理。但類并非真正的要求,只是有時(shí),類是一種抽象具有公共屬性的對(duì)象集的簡(jiǎn)便方法而已。因此,即使一種語言的支持對(duì)象沒有類,它也可以是面向?qū)ο蟮恼Z言,例如JavaScript。

此外,OOP原則的目的旨在得到支持。為了在語言中進(jìn)行編程,OOP原則不應(yīng)該是強(qiáng)制規(guī)定的。開發(fā)人員可以選擇使用允許他創(chuàng)建面向?qū)ο蟠a的構(gòu)造,也可以選擇不使用。許多人批評(píng)JavaScript是因?yàn)殚_發(fā)人員可以編寫違反OOP原則的代碼。但這只是程序員的選擇,而不是語言的限制。其他的編程語言也會(huì)發(fā)生這樣的事情,如C ++。

所以,我們可以得出這樣一個(gè)結(jié)論,缺乏抽象類并允許開發(fā)人員自由使用或不使用支持OOP原理的功能,并非認(rèn)定JavaScript是OOP語言的真正障礙。

責(zé)任編輯:未麗燕 來源: 碼農(nóng)網(wǎng)
相關(guān)推薦

2015-12-30 13:43:35

云計(jì)算私有云公共云

2009-06-02 13:43:04

程序員定義職場(chǎng)

2015-09-22 14:19:56

Cloud NativDevOps持續(xù)交付

2015-03-20 16:16:56

APM應(yīng)用性能管理云智慧

2016-10-19 14:35:20

JavaScript函數(shù)式編程

2017-01-10 09:48:58

PHP語言Perl

2018-11-21 09:22:54

策略梯度算法機(jī)器學(xué)習(xí)強(qiáng)化學(xué)習(xí)

2024-01-08 07:02:48

數(shù)據(jù)設(shè)計(jì)模式

2013-01-04 13:50:06

Ubuntu

2009-02-02 09:04:52

MVC框架Java

2013-11-06 09:12:35

異構(gòu)計(jì)算移動(dòng)計(jì)算

2022-04-15 06:47:54

敏捷開發(fā)代碼開發(fā)

2010-10-08 09:13:15

oop模式JavaScript

2019-01-30 12:38:41

JavaScript前端編程語言

2012-03-28 09:40:40

JavaScript

2023-05-15 08:01:16

Go語言

2011-09-16 10:55:06

2022-08-17 17:57:37

GoGo語言

2021-05-28 05:34:06

Golang語言編程

2019-04-10 19:05:00

云計(jì)算云端遷移
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)