亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

深入理解JavaScript系列(17):面向對象編程之概論詳細介紹

2019-11-20 13:01:07
字體:
來源:轉載
供稿:網友

介紹

在本篇文章,我們考慮在ECMAScript中的面向對象編程的各個方面(雖然以前在許多文章中已經討論過這個話題)。我們將更多地從理論方面看這些問題。 特別是,我們會考慮對象的創建算法,對象(包括基本關系 - 繼承)之間的關系是如何,也可以在討論中使用(我希望將消除之前對于JavaScript中OOP的一些概念歧義)。

英文原文:http://dmitrysoshnikov.com/ecmascript/chapter-7-1-oop-general-theory/

概論、范式與思想

在進行ECMAScript中的OOP技術分析之前,我們有必要掌握一些OOP基本的特征,并澄清概論中的主要概念。

ECMAScript支持包括結構化、面向對象、函數式、命令式等多種編程方式,某些情況下還支持面向方面編程;但本文是討論面向對象編程,所以來給出ECMAScript中面向對象編程的定義:

ECMAScript是基于原型實現的面向對象編程語言。
基于原型的OOP和基于靜態類的方式直接有很多差異。 讓我們一起來看看他們直接詳細的差異。

基于類特性和基于原型

注意,在前面一句很重要的一點已經指出的那樣-完全基于靜態類。 隨著“靜態”一詞,我們了解靜態對象和靜態類,強類型(雖然不是必需的)。

關于這種情況,很多論壇上的文檔都有強調這是他們反對將在JavaScript里將“類與原型”進行比較的主要原因,盡管他們在實現上的有所不同(例如基于動態類的Python和Ruby)不是太反對的重點(某些條件寫,盡管思想上有一定不同,但JavaScript沒有變得那么另類),但他們反對的重點是靜態類和動態原型(statics + classes vs. dynamics + prototypes),確切地說,一個靜態類(例如:C + +,JAVA)和他的屬下及方法定義的機制可以讓我們看到它和基于原型實現的準確區別。

但是,讓我們來一個一個列舉一下。 讓我們考慮總則和這些范式的主要概念。

基于靜態類

在基于類的模型中,有個關于類和實例的概念。 類的實例也常常被命名為對象或范例 。

類與對象

類代表了一個實例(也就是對象)的抽象。在這方面有點像數學,但我們一把稱之為類型(type)或分類(classification)。

例如(這里和下面的例子都是偽代碼):

復制代碼 代碼如下:

C = Class {a, b, c} // 類C, 包括特性a, b, c

實例的特點是:屬性(對象描述 )和方法(對象活動)。特性本身也可視為對象:即屬性是否可寫的,可配置,可設置的(getter/setter)等。因此,對象存儲了狀態 (即在一個類中描述的所有屬性的具體值),類為他們的實例定義了嚴格不變的結構(屬性)和嚴格不變的行為(方法)。
復制代碼 代碼如下:

C = Class {a, b, c, method1, method2}
 
c1 = {a: 10, b: 20, c: 30} // 類C是實例:對象с1
c2 = {a: 50, b: 60, c: 70} // 類C是實例:對象с2,擁有自己的狀態(也就是屬性值)

層次繼承

為了提高代碼重用,類可以從一個擴展為另一個,在加上額外的信息。 這種機制被稱為(分層)繼承 。

復制代碼 代碼如下:

D = Class extends C = {d, e} // {a, b, c, d, e}
d1 = {a: 10, b: 20, c: 30, d: 40, e: 50}

在類的實例上調用方的時候,通常會現在原生類本書就查找該方法,如果沒找到就到直接父類去查找,如果還沒找到,就到父類的父類去查找(例如嚴格的繼承鏈上),如果查到繼承的頂部還沒查到,那結果就是:該對象沒有類似的行為,也沒辦法獲取結果。

復制代碼 代碼如下:

d1.method1() // D.method1 (no) -> C.method1 (yes)
d1.method5() // D.method5 (no) -> C.method5 (no) -> no result

與在繼承里方法不復制到一個子類相比,屬性總是被復雜到子類里的。 我們可以看到子類D繼承自父類C類:屬性a,b,c是復制過去了,D的結構是{a, b, c, d, e} } 。然而,方法{method1, method2}是沒有復制過去,而是繼承過去的。 因此,也就是說如果一個很深層次的類有一些對象根本不需要的屬性的話,那子類也有擁有這些屬性。

基于類的關鍵概念

因此,我們有如下關鍵概念:

1.創建一個對象之前,必須聲明類,首先有必要界定其類
2.因此,該對象將由抽象成自身“象形和相似性”(結構和行為)的類里創建
3.方法是通過了嚴格的,直接的,一成不變的繼承鏈來處理
4.子類包含了繼承鏈中所有的屬性(即使其中的某些屬性是子類不需要的);
5.創建類實例,類不能(因為靜態模型)來改變其實例的特征(屬性或方法);
6.實例(因為嚴格的靜態模型)除了有該實例所對應類里聲明的行為和屬性以外,是不能額外的行為或屬性的。

讓我們看看在JavaScript里如何替代OOP模型,也就是我們所建議的基于原型的OOP。

基于原型
這里的基本概念是動態可變對象。轉換(完整轉換,不僅包括值,還包括特性)和動態語言有直接關系。下面這樣的對象可以獨立存儲他們所有的特性(屬性,方法)而不需要的類。

復制代碼 代碼如下:

object = {a: 10, b: 20, c: 30, method: fn};
object.a; // 10
object.c; // 30
object.method();

此外,由于動態的,他們可以很容易地改變(添加,刪除,修改)自己的特性:

復制代碼 代碼如下:

object.method5 = function () {...}; // 添加新方法
object.d = 40; // 添加新屬性 "d"
delete object.c; // 刪除屬性 "с"
object.a = 100; // 修改屬性 "а"
 
// 結果是: object: {a: 100, b: 20, d: 40, method: fn, method5: fn};

也就是說,在賦值的時候,如果某些特性不存在,則創建它并且將賦值與它進行初始化,如果它存在,就只是更新。

在這種情況下,代碼重用不是通過擴展類來實現的,(請注意,我們沒有說類沒辦法改變,因為這里根本沒有類的概念),而是通過原型來實現的。

原型是一個對象,它是用來作為其他對象的原始copy,或者如果一些對象沒有自己的必要特性,原型可以作為這些對象的一個委托而當成輔助對象。

基于委托

任何對象都可以被用來作為另一個對象的原型對象,因為對象可以很容易地在運行時改變它的原型動態。

注意,目前我們正在考慮的是概論而不是具體實現,當我們在ECMAScript中討論具體實現時,我們將看到他們自身的一些特點。

例(偽代碼):

復制代碼 代碼如下:

x = {a: 10, b: 20};
y = {a: 40, c: 50};
y.[[Prototype]] = x; // x是y的原型
 
y.a; // 40, 自身特性
y.c; // 50, 也是自身特性
y.b; // 20 亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产成人精品免高潮在线观看| 大量国产精品视频| 中文字幕亚洲无线码在线一区| 91在线观看免费网站| 国产精品网红福利| 欧美日韩在线第一页| 欧美极品少妇xxxxⅹ裸体艺术| 麻豆国产va免费精品高清在线| 91久久国产精品91久久性色| 91丨九色丨国产在线| 日韩欧美福利视频| 中文字幕精品一区二区精品| 欧美日韩国产精品一区二区不卡中文| 亚洲国产精品视频在线观看| 亚洲一区美女视频在线观看免费| 欧美午夜精品在线| 18一19gay欧美视频网站| 国产成人综合av| 亚洲一区二区三区777| 国产丝袜高跟一区| 日韩在线观看免费高清| 精品亚洲一区二区三区| 精品国产乱码久久久久久虫虫漫画| 亚洲国产精品福利| 亚洲的天堂在线中文字幕| 国产亚洲欧美日韩精品| 国产区精品在线观看| 日韩精品视频中文在线观看| 久久伊人精品一区二区三区| 日韩精品欧美激情| 国产精品久久久久久久久久| 国产精品xxx视频| 国产精品爱久久久久久久| 亚洲一区二区三区xxx视频| 久久国产精品久久国产精品| xvideos国产精品| 最近2019免费中文字幕视频三| 在线观看视频99| 欧美一级视频免费在线观看| 国产网站欧美日韩免费精品在线观看| 亚洲成人免费在线视频| 91高清免费视频| 亚洲精品自拍第一页| 亚洲嫩模很污视频| 菠萝蜜影院一区二区免费| 日本久久久久久久久久久| 亚洲高清不卡av| 欧美日韩国产综合新一区| 欧美视频不卡中文| 国产精品一区=区| 国产成人精品在线播放| 欧美日韩裸体免费视频| 亚洲欧美资源在线| 欧美视频在线视频| 国产在线一区二区三区| 91久久精品久久国产性色也91| www.xxxx欧美| 欧美体内谢she精2性欧美| 国产精品久久久久久亚洲影视| 国产噜噜噜噜久久久久久久久| 在线看日韩欧美| 日韩在线欧美在线国产在线| 91久久在线播放| 亚洲成人亚洲激情| 亚洲精品动漫100p| 一区二区三区天堂av| 2020国产精品视频| 国产99久久精品一区二区永久免费| 欧美午夜片欧美片在线观看| 欧美日韩国产91| 久久久精品日本| 不卡中文字幕av| 亚洲欧美激情另类校园| 亚洲天堂视频在线观看| 大桥未久av一区二区三区| 成人国产亚洲精品a区天堂华泰| 久久久亚洲精品视频| 久久精品国产69国产精品亚洲| 国产精品中文久久久久久久| 亚洲奶大毛多的老太婆| 自拍视频国产精品| 国产精品极品在线| 国产精品男女猛烈高潮激情| 亚洲欧美日韩第一区| 日韩一区二区av| 久久久久久久91| 国产精品精品视频| 成人黄色av免费在线观看| 亚洲午夜精品久久久久久性色| 久久久女人电视剧免费播放下载| 中文字幕久精品免费视频| 亚洲欧洲一区二区三区久久| 国产97在线视频| 668精品在线视频| 亚洲第一福利网| 日韩欧美在线免费| 国产啪精品视频| 中文字幕视频一区二区在线有码| 91精品在线看| 亚洲精品国产精品乱码不99按摩| 国产精品午夜国产小视频| 久久久久免费精品国产| 久久精品色欧美aⅴ一区二区| 亚洲欧美日韩另类| 精品亚洲男同gayvideo网站| 日本人成精品视频在线| 大量国产精品视频| 亚洲黄色成人网| 久久亚洲国产精品成人av秋霞| 欧美精品制服第一页| 欧美大片网站在线观看| 中文日韩在线观看| 中文字幕亚洲欧美日韩2019| 中文字幕精品久久| 精品国产一区二区三区久久久狼| 亚洲国产精品一区二区三区| 成人免费看片视频| 狠狠躁18三区二区一区| 国产福利视频一区二区| 亚洲欧美激情四射在线日| 国产在线观看一区二区三区| 亚洲精品欧美一区二区三区| 日韩美女福利视频| 久久久久久久久久国产精品| 亚洲xxxxx| 久久影视三级福利片| 欧美成人剧情片在线观看| 欧美中文字幕在线观看| 国产精品嫩草影院一区二区| 亚洲综合中文字幕在线| 中文.日本.精品| 欧美日韩在线视频首页| 中文字幕综合一区| 亚洲精品99久久久久| 欧美高清电影在线看| 日韩av片免费在线观看| 日韩成人网免费视频| 亚洲第一视频在线观看| 精品中文字幕在线| 97视频在线观看视频免费视频| 色悠悠国产精品| 中文字幕在线亚洲| 成人情趣片在线观看免费| 日韩一区二区欧美| 久久久久久香蕉网| 日韩欧美亚洲一二三区| 成人免费午夜电影| 欧美最猛性xxxx| 欧美人与物videos| 亚洲综合成人婷婷小说| 少妇激情综合网| 亚洲最大福利视频网站| 亚洲激情在线观看| 亚洲一区二区中文字幕| 97视频网站入口| 亚洲欧美中文日韩v在线观看| 韩日精品中文字幕| 欧美亚洲在线观看| 亚洲跨种族黑人xxx| 欧美高清视频在线| 狠狠操狠狠色综合网| 精品国产欧美一区二区三区成人| 91性高湖久久久久久久久_久久99| 国产精品成人一区二区三区吃奶|