精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

再談JavaScript面向對象編程

開發 前端
雖有陳皓《Javascript 面向對象編程》珠玉在前,但是我還是忍不住再畫蛇添足的補上一篇文章,主要是因為javascript這門語言魅力。另外這篇文章是一篇入門文章。

雖有陳皓《Javascript 面向對象編程》珠玉在前,但是我還是忍不住再畫蛇添足的補上一篇文章,主要是因為javascript這門語言魅力。另外這篇文章是一篇入門文章,我也是才開始學習Javascript,有一點心得,才想寫一篇這樣文章,文章中難免有錯誤的地方,還請各位不吝吐槽指正

51CTO推薦專題:JavaScript入門

吐槽Javascript

初次接觸Javascript,這門語言的確會讓很多正規軍感到諸多的不適,這種不適來自于Javascript的語法的簡練和不嚴謹,這種不適也來自Javascript這個悲催的名稱,我在想網景公司的Javascript設計者在給他起名稱那天一定是腦殼進水了,讓Javascript這么多年來受了這么多不白之冤,人們都認為他是Java的附屬物,一個WEB玩具語言。因此才會有些人會對Javascript不屑,認為Javascript不是一門真正的語言,但是這此他們真的錯了。Javascript不僅是一門語言,是一門真真正正的語言,而且他還是一門里程碑式的語言,他***多種新的編程模式原型繼承,閉包,對后來的動態語言產生了巨大的影響。做為當今***的語言(沒有之一),看看git上提交的最多的語言類型就能明白。隨著HTML5的登場,瀏覽器將在個人電腦上將大顯身手,完全有替換OS的趨勢的時候,Javascript做為瀏覽器上的一門唯一真真的語言,如同C之于 unix/linux,java之于JVM,Cobol之于MainFrame,我們也需要來重新的認真地認識和審視這門語言。另外Javascript的正式名稱是:ECMAScript,這個名字明顯比Javascript帥太多了!

言歸正傳,我們切入主題——Javascript的面向對象編程。要談Javascript的面向對象編程,我們***步要做的事情就是忘記我們所學的面向對象編程。傳統C++或Java的面向對象思維來學習Javascript的面向對象會給你帶來不少困惑,讓我們先忘記我們所學的,從新開始學習這門特殊的面向對象編程。既然是OO編程,要如何來理解OO編程呢,記得以前學C++,學了很久都不入門,后來有幸讀了《Inside The C++ Object Model》這本大作,頓時豁然開朗,因此本文也將以對象模型的方式來探討的Javascript的OO編程。因為Javascript 對象模型的特殊性,所以使得Javascript的繼承和傳統的繼承非常不一樣,同時也因為Javascript里面沒有類,這意味著Javascript里面沒有extends,implements。那么Javascript到底是如何來實現OO編程的呢?好吧,讓我們開始吧,一起在Javascript的OO世界里來一次漫游

首先,我們需要先看看Javascript如何定義一個對象。下面是我們的一個對象定義:

  1. var o = {}; 

還可以這樣定義一個對象

  1. function f() {  

對,你們沒有看錯,在Javascript里面,函數也是對象。

當然還可以

  1. var array1= [ 1,2,3]; 

數組也是一個對象。

其他關于對象的基本的概念的描述,還是請各位親們參見陳皓《Javascript 面向對象編程》文章。

對象都有了,唯一沒有的就是class,因為在Javascript里面是沒有class關鍵字的,算好還有function,function的存在讓我們可以變通的定義類,在擴展這個主題前,我們還需要了解一個Javascript對象最重要的屬性,__proto__成員。

__proto__成員

嚴格的說這個成員不應該叫這個名字,__proto__是Firefox中的稱呼,__proto__只有在Firefox瀏覽器中才能被訪問到。做為一個對象,當你訪問其中的一個成員或方法的時候,如果這個對象中沒有這個方法或成員,那么Javascript引擎將會訪問這個對象的__proto__成員所指向的另外的一個對象,并在那個對象中查找指定的方法或成員,如果不能找到,那就會繼續通過那個對象的__proto__成員指向的對象進行遞歸查找,直到這個鏈表結束。

好了,讓我們舉一個例子。

比如上上面定義的數組對象array1。當我們創建出array1這個對象的時候,array1實際在Javascript引擎中的對象模型如下:

 

 

array1對象具有一個length屬性值為3,但是我們可以通過如下的方法來為array1增加元素:

  1. array1.push(4); 

push這個方法來自于array1的__proto__成員指向對象的一個方法(Array.prototye.push())。正是因為所有的數組對象(通過[]來創建的)都包含有一個指向同一個具有push,reverse等方法對象(Array.prototype)的__proto__成員,才使得這些數組對象可以使用push,reverse等方法。

那么這個__proto__這個屬性就相當于面向對象中的”has a”關系,這樣的的話,只要我們有一個模板對象比如Array.prototype這個對象,然后把其他的對象__proto__屬性指向這個對象的話就完成了一種繼承的模式。不錯!我們完全可以這么干。但是別高興的太早,這個屬性只在FireFox中有效,其他的瀏覽器雖然也有屬性,但是不能通過__proto__來訪問,只能通過getPrototypeOf方法進行訪問,而且這個屬性是只讀的。看來我們要在Javascript實現繼承并不是很容易的事情啊。

函數對象prototype成員

首先我們先來看一段函數prototype成員的定義,

When a function object is created, it is given a prototype member which is an object containing a constructor member which is a reference to the function object

當一個函數對象被創建時,這個函數對象就具有一個prototype成員,這個成員是一個對象,這個對象包含了一個構造子成員,這個構造子成員會指向這個函數對象。

例如:

  1. function Base() {  
  2.     this.id = "base" 

Base這個函數對象就具有一個prototype成員,關于構造子其實Base函數對象自身,為什么我們將這類函數稱為構造子呢?原因是因為這類函數設計來和new 操作符一起使用的。為了和一般的函數對象有所區別,這類函數的首字母一般都大寫。構造子的主要作用就是來創建一類相似的對象。

上面這段代碼在Javascript引擎的對象模型是這樣的

 

 

new 操作符

在有上面的基礎概念的介紹之后,在加上new操作符,我們就能完成傳統面向對象的class + new的方式創建對象,在Javascript中,我們將這類方式成為Pseudoclassical。

基于上面的例子,我們執行如下代碼

  1. var obj = new Base(); 

這樣代碼的結果是什么,我們在Javascript引擎中看到的對象模型是:

 

 

new操作符具體干了什么呢?其實很簡單,就干了三件事情。

  1. var obj  = {};  
  2. obj.__proto__ = Base.prototype;  
  3. Base.call(obj); 

***行,我們創建了一個空對象obj

第二行,我們將這個空對象的__proto__成員指向了Base函數對象prototype成員對象

第三行,我們將Base函數對象的this指針替換成obj,然后再調用Base函數,于是我們就給obj對象賦值了一個id成員變量,這個成員變量的值是”base”,關于call函數的用法,請參看陳皓《Javascript 面向對象編程》文章

如果我們給Base.prototype的對象添加一些函數會有什么效果呢?

例如代碼如下:

  1. Base.prototype.toString = function() {  
  2.     return this.id;  

那么當我們使用new創建一個新對象的時候,根據__proto__的特性,toString這個方法也可以做新對象的方法被訪問到。于是我們看到了:

構造子中,我們來設置‘類’的成員變量(例如:例子中的id),構造子對象prototype中我們來設置‘類’的公共方法。于是通過函數對象和Javascript特有的__proto__與prototype成員及new操作符,模擬出類和類實例化的效果。

Pseudoclassical 繼承

我們模擬類,那么繼承又該怎么做呢?其實很簡單,我們只要將構造子的prototype指向父類即可。例如我們設計一個Derive 類。如下

  1. function Derive(id) {  
  2.     this.id = id;  
  3. }  
  4. Derive.prototype = new Base();  
  5. Derive.prototype.test = function(id){  
  6.     return this.id === id;  
  7. }  
  8. var newnewObj = new Derive("derive"); 

這段代碼執行后的對象模型又是怎么樣的呢?根據之前的推導,應該是如下的對象模型

 

 

這樣我們的newObj也繼承了基類Base的toString方法,并且具有自身的成員id。關于這個對象模型是如何被推導出來的就留給各位同學了,參照前面的描述,推導這個對象模型應該不難。

Pseudoclassical繼承會讓學過C++/Java的同學略微的感受到一點舒服,特別是new關鍵字,看到都特親切,不過兩者雖然相似,但是機理完全不同。當然不關什么樣繼承都是不能離不開__proto__成員的。

Prototypal繼承

這是Javascript的另外一種繼承方式,這個繼承也就是之前陳皓文章《Javascript 面向對象編程》中create函數,非常可惜的是這個是ECMAScript V5的標準,支持V5的瀏覽器目前看來也就是IE9,Chrome***版本和Firefox。雖然看著多,但是做為IE6的重災區的中國,我建議各位還是避免使用create函數。好在沒有create函數之前,Javascript的使用者已經設計出了等同于這個函數的。例如:我們看看Douglas Crockford的object函數。

  1. function object(old) {  
  2.    function F() {};  
  3.    F.prototype = old;  
  4.    return new F();  
  5. }  
  6. var newObj = object(oldObject); 

例如如下代碼段

  1. var base ={  
  2.   id:"base",  
  3.   toString:function(){  
  4.           return this.id;  
  5.   }  
  6. };  
  7. var derive = object(base); 

上面函數的執行后的對象模型是:

 

 

如何形成這樣的對象模型,原理也很簡單,只要把object這個函數擴展一下,就能畫出這個模型,怎么畫留給讀者自己去畫吧。

這樣的繼承方式被稱為原型繼承。相對來說要比Pseudoclassical繼承來的簡單方便。ECMAScript V5正是因為這原因也才增加create函數,讓開發者可以快速的實現原型繼承。

上述兩種繼承方式是Javascript中最常用的繼承方式。通過本文的講解,你應該對Javascript的OO編程有了一些‘原理’級的了解了吧

參考:

《Prototypes and Inheritance in JavaScript Prototypes and Inheritance in JavaScript》

Advance Javascript (Douglas Crockford 大神的視頻,一定要看啊)

題外話:

web2.0后,web應用可謂飛速發展,如今在HTML5發布之際,瀏覽器的功能被大大強化,我感覺Browser遠遠在不是一個Browser那么簡單了。記得C++之父曾經這樣說過JAVA,JAVA不是跨平臺,JAVA本身就是一個平臺。如今的Browser也本身就是一個平臺了,好在這個平臺是基于標準的。如果Browser是平臺,由于Browser安全沙箱的限制,個人電腦的資源被使用的很少,感覺Browser就是一個NC(Network Computer)?我們居然又回到了Sun最初提出的構想,Sun是不是太強大了些?

原文:http://coolshell.cn/articles/6668.html

【編輯推薦】

  1. JavaScript面向對象編程深入分析
  2. JavaScript組件模式深入淺出
  3. JavaScript繼承詳解
  4. JavaScript面向對象編程
  5. JavaScript中的陷阱大集合
責任編輯:陳貽新 來源: 酷殼
相關推薦

2017-04-21 09:07:39

JavaScript對象編程

2012-01-17 09:34:52

JavaScript

2011-05-25 10:21:44

Javascript

2011-05-25 10:59:26

Javascript繼承

2010-10-08 09:13:15

oop模式JavaScript

2011-06-28 14:11:33

JavaScript

2011-05-25 11:15:02

Javascript繼承

2010-11-17 11:31:22

Scala基礎面向對象Scala

2019-11-18 17:05:02

JavaScript面向對象程序編程Java

2023-02-22 18:06:35

函數javascript面向對象編程

2022-07-30 23:41:53

面向過程面向對象面向協議編程

2021-10-21 18:47:37

JavaScript面向對象

2012-12-13 11:01:42

IBMdW

2011-05-13 11:05:52

javascript

2019-03-26 10:50:22

Python面向對象編程語言

2023-01-10 09:06:17

2011-06-28 11:06:16

Scala

2012-12-18 09:24:47

2010-07-13 17:18:29

Perl面向對象編程

2010-07-16 17:23:57

Perl面向對象編程
點贊
收藏

51CTO技術棧公眾號

精品福利一区二区三区免费视频| 国产精品色呦呦| 久久人人爽人人爽人人片av高清| 麻豆精品国产传媒av| 在线成人av观看| 国产精品传媒在线| 国产欧美日韩综合一区在线观看 | 国产综合香蕉五月婷在线| 老熟妇高潮一区二区三区| 久久影院资源站| 欧美精品三级在线观看| 国产91在线视频观看| 日本中文字幕电影在线免费观看| 成人av中文字幕| 成人中心免费视频| 在线观看亚洲黄色| 激情偷拍久久| 久久久国产精品一区| 成人午夜剧场视频网站| 影音先锋欧美激情| 欧美三级资源在线| 久久久久久久中文| 色女人在线视频| 国产精品理论片在线观看| 国产综合色一区二区三区| 国产精品国产一区二区三区四区 | 国产人妻精品午夜福利免费| 精品成人免费一区二区在线播放| 亚洲影院理伦片| 亚洲三级一区| 国产二区在线播放| 97se亚洲国产综合自在线| 亚洲一区二区三区视频播放| 中文字幕 亚洲视频| 久久一综合视频| 97在线免费观看| 久久综合综合久久| 综合激情视频| 欧美精品日韩www.p站| 国产在线综合视频| 国产成人1区| 亚洲精品中文字幕女同| 久久久午夜精品福利内容| 深夜激情久久| 日韩免费电影一区| 51自拍视频在线观看| 天堂综合在线播放| 欧美视频完全免费看| 免费观看成人在线视频| 欧美国产大片| 在线观看日韩电影| 激情五月婷婷久久| 精品123区| 欧美性猛交xxxx乱大交退制版 | 欧美精品资源| 欧洲精品视频在线观看| 亚洲欧美另类动漫| 草民电影神马电影一区二区| 欧美视频一区在线观看| 无尽裸体动漫2d在线观看| 色综合久久久| 日韩一区二区三区免费看 | 国产丝袜在线精品| 日本一区二区精品视频| 波多野结衣在线影院| 国产精品丝袜久久久久久app| 亚洲天堂电影网| 久草中文在线观看| 亚洲主播在线观看| 男人和女人啪啪网站| 欧美gay囗交囗交| 欧美日韩激情一区二区三区| 欧美大片久久久| 视频一区日韩精品| 日韩成人av在线播放| 白丝女仆被免费网站| 精品理论电影在线| 毛片精品免费在线观看| 日韩大片免费在线观看| 久色成人在线| 91久久久久久久久久| 亚洲女人18毛片水真多| 久久久综合视频| 日本黄色a视频| а_天堂中文在线| 日本韩国欧美在线| 亚洲av毛片在线观看| 欧美成人一区在线观看| 在线观看精品国产视频| 欧美成人手机视频| 美女黄网久久| 亚洲一区亚洲二区亚洲三区| 神宫寺奈绪一区二区三区| 国产亚洲美州欧州综合国| 中国人体摄影一区二区三区| 玖玖在线播放| 欧美精品v日韩精品v韩国精品v| 中文字幕天堂av| 青青草成人影院| 亚州av一区二区| 国产又色又爽又黄又免费| av不卡免费电影| 中文字幕日韩一区二区三区不卡| av在线播放资源| 欧美日韩国产美| 免费无码一区二区三区| 91精品国产乱码久久久久久| 欧美在线一区二区三区四| 国产视频www| 国产亚洲精品7777| 日本丰满少妇xxxx| 国产视频一区二区在线播放| 亚洲一二在线观看| 久久久久久久久精| 奇米色一区二区| 久久精品国产一区二区三区日韩 | 66m—66摸成人免费视频| 一级黄色片在线看| 91免费版在线| 女人色极品影院| 日本在线一区二区| 亚洲欧美激情在线视频| 国产无遮挡免费视频| 激情六月婷婷久久| 日韩视频精品| 在线免费看h| 亚洲成人黄色在线| 久久久久成人精品无码| 国产麻豆视频一区| 亚洲欧美成人一区| 日韩av超清在线观看| 日韩成人在线免费观看| 18精品爽视频在线观看| 国产一本一道久久香蕉| 少妇特黄a一区二区三区| 英国三级经典在线观看| 亚洲国产精品嫩草影院久久| 久久久久久久久99| 国产69精品久久久久777| 艳母动漫在线免费观看| 4438五月综合| 久久亚洲春色中文字幕| 又污又黄的网站| 欧美激情自拍偷拍| 黄色av免费在线播放| 一道在线中文一区二区三区| 欧美一级黄色网| 青青久草在线| 欧美专区在线观看一区| 日韩视频在线观看免费视频| 麻豆91精品| 日韩免费av电影| 性欧美freehd18| 中文字幕日韩精品在线观看| 亚洲av无码乱码国产精品fc2| 国产亚洲综合色| 国产福利一区视频| 精品国产aⅴ| 国产精品日韩专区| 一级日本在线| 欧美一区二区三区四区久久| 欧美黄色aaa| 国产高清在线精品| 亚洲熟妇无码av在线播放| 盗摄系列偷拍视频精品tp| 韩国三级日本三级少妇99| 天天干天天摸天天操| 日韩欧美高清视频| 中文字幕被公侵犯的漂亮人妻| 水蜜桃久久夜色精品一区的特点| 图片区小说区区亚洲五月| 国产精品蜜月aⅴ在线| 久久视频在线播放| 亚洲精品18p| 色婷婷精品久久二区二区蜜臂av| 国产免费嫩草影院| 国产成人精品一区二 | 美女一区二区三区在线观看| 亚洲成人动漫在线| 久久久久97| 国产精品吊钟奶在线| 黄色av免费在线| 亚洲精品wwww| 一本久道久久综合无码中文| 亚洲自拍欧美精品| 国产亚洲精品熟女国产成人| 激情久久久久久久久久久久久久久久| 成人免费在线网| 日韩精品一区二区久久| 国产a一区二区| 欧美不卡高清一区二区三区| 欧美噜噜久久久xxx| 日本ー区在线视频| 日韩欧美中文字幕一区| 国产精品人人人人| 有码一区二区三区| 色欲av无码一区二区三区| 国产一区二区精品久久91| 亚洲精品无码久久久久久| 一本一本久久a久久综合精品| 精品中文字幕人| 国产精品99久久免费| 欧美怡春院一区二区三区| 亚洲色图美国十次| 国产亚洲视频在线观看| 丰满肉嫩西川结衣av| 欧美视频在线一区| 久久艹免费视频| 一区二区三区在线观看欧美| 日韩毛片无码永久免费看| 成人av网在线| 久久综合桃花网| 日本aⅴ精品一区二区三区 | 亚洲欧美电影| 色综合久久精品亚洲国产| jizz在线观看中文| 日韩高清有码在线| 国产福利第一页| 欧美美女一区二区在线观看| 亚洲av无码不卡| 午夜激情一区二区三区| 波多野结衣亚洲色图| 中文字幕精品综合| 熟女少妇一区二区三区| 成人午夜碰碰视频| 天天干天天曰天天操| 久久成人18免费观看| 成人亚洲视频在线观看| 国产精品一级| 日本午夜激情视频| 欧美视频官网| 日本a级片在线观看| 日本一区二区在线看| 日本在线观看一区| 亚洲bt欧美bt精品777| 好吊妞www.84com只有这里才有精品 | 醉酒壮男gay强迫野外xx| 岛国av在线一区| www.黄色网| 不卡欧美aaaaa| 国产熟女高潮一区二区三区| 不卡视频一二三| 一区二区免费在线观看视频| 不卡在线视频中文字幕| 香蕉在线观看视频| 国产成都精品91一区二区三| 人妻巨大乳一二三区| 国产精品88av| 第一页在线视频| 成人午夜精品在线| av在线播放网址| 97se亚洲国产综合自在线不卡| 熟女人妻在线视频| 久久女同性恋中文字幕| 这里只有久久精品| 欧美激情在线一区二区三区| 久久视频一区二区三区| 国产精品麻豆视频| 成人免费视频国产免费观看| 亚洲免费观看高清完整版在线观看熊| 538精品在线观看| 性久久久久久久久久久久| 黑人一级大毛片| 色成年激情久久综合| 中文字幕一区二区三区四区免费看 | 久久综合色视频| 日韩精品成人一区二区三区| 九色porny自拍| 国产精品12区| 亚洲av无码一区二区三区网址| 久久精品视频在线免费观看| 国产精品69久久久久孕妇欧美| 亚洲人成精品久久久久| 国产污片在线观看| 色菇凉天天综合网| 国产精品久久久久久久久毛片| 亚洲精品一区二区三区蜜桃下载 | 国产91在线视频观看| 蜜臀精品一区二区三区在线观看| 国产精品嫩草影视| 91啪九色porn原创视频在线观看| 欧美性猛交xxxx乱大交少妇| 一区二区成人在线| 无码人妻丰满熟妇精品| 在线不卡欧美精品一区二区三区| 三级视频在线看| 最新日韩中文字幕| 国产桃色电影在线播放| 国产成人精品综合| 日韩精品成人在线观看| 欧美亚洲另类久久综合| 小小影院久久| 97超碰青青草| 国产米奇在线777精品观看| 野外性满足hd| 一区二区在线观看视频| 日韩综合在线观看| 日韩欧美综合在线| 国产经典自拍视频在线观看| 欧美精品激情在线| 欧美成人aaa| 久久人人九九| 国产精品黄色| 午夜大片在线观看| 国产女同性恋一区二区| 日本特黄一级片| 欧美一区二区三级| 国产福利在线看| 4438全国成人免费| 涩爱av色老久久精品偷偷鲁| 亚洲精品人成| 久久婷婷一区| 免费a v网站| 亚洲一区二区四区蜜桃| 一级特黄aaa大片| 伊人久久免费视频| 亚洲人体视频| 国产一区二区三区高清视频| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 国产精品色婷婷视频| 欧美男人操女人视频| 日本免费成人网| 精品在线播放午夜| 三年中国中文观看免费播放| 粉嫩老牛aⅴ一区二区三区| 丰满少妇一级片| 欧美激情综合亚洲一二区| 精品成人18| 中文字幕日韩一区二区三区| 免费成人在线观看视频| 在线不卡av电影| 婷婷成人综合网| 天天干天天舔天天射| 国产做受高潮69| 国产精品一线| 国产免费观看高清视频| 99久久久免费精品国产一区二区| 青娱乐在线视频免费观看| 日韩午夜激情电影| av免费看在线| 97久久夜色精品国产九色| 中文字幕av亚洲精品一部二部| 最新av免费在线观看| 中文字幕一区二区三区在线不卡| 在线免费观看av片| 中国日韩欧美久久久久久久久| 欧美日韩在线精品一区二区三区激情综合 | 国产情侣av自拍| 中文子幕无线码一区tr| 中文字幕免费观看视频| 丝袜一区二区三区| 国产国产一区| 99久re热视频精品98| 国产成人精品1024| 日韩欧美大片在线观看| 亚洲精品福利资源站| 在线最新版中文在线| 日本在线高清视频一区| 美女视频黄久久| fc2ppv在线播放| 欧美变态口味重另类| 高清毛片在线观看| 欧美在线激情| 麻豆高清免费国产一区| 放荡的美妇在线播放| 亚洲精品一区二区三区影院| 亚洲小少妇裸体bbw| 亚洲午夜精品福利| 国产精品一卡二| 男女视频免费看| 国产亚洲欧美日韩精品| 国产一区二区在线观| www国产精品内射老熟女| 久久综合99re88久久爱| 中文字幕av免费观看| 欧美日韩国产成人在线| 国产精品片aa在线观看| 加勒比av中文字幕| 午夜亚洲国产au精品一区二区| 男女网站在线观看| 成人情趣片在线观看免费| 亚洲日本激情| 精品视频第一页| 亚洲精品美女免费| 91精品论坛| 可以免费看的黄色网址| 91浏览器在线视频| 一级全黄裸体免费视频| 91国语精品自产拍在线观看性色 | 在线观看国产福利| 亚洲永久精品大片| 成人影视在线播放| 国产精品久久久久久久久久久久午夜片 | 91插插插插插插插插| 一区二区三区欧美视频| 日韩私人影院| av一区二区三区在线观看| 日韩中文字幕91| 国产午夜视频在线| 色777狠狠综合秋免鲁丝|