成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Javascript繼承機制的設計思想

開發 前端
本文主要介紹Javascript繼承機制的設計思想。Javascript本身是從Perl語言的語法演變而來的,本質上是腳本語言,隨著版本的更新逐漸加入的對面向對象的模擬。希望對你有幫助,一起來看。

Javascript本身是從Perl語言的語法演變而來的,本質上是腳本語言,隨著版本的更新逐漸加入的對面向對象的模擬。我一直很難理解Javascript語言的繼承機制。

它沒有"子類"和"父類"的概念,也沒有"類"(class)和"實例"(instance)的區分,全靠一種很奇特的"原型鏈"(prototype chain)模式,來實現繼承。

我花了很多時間,學習這個部分,還做了很多筆記。但是都屬于強行記憶,無法從根本上理解。

直到昨天,我讀到法國程序員Vjeux的解釋,才恍然大悟,完全明白了Javascript為什么這樣設計。

下面,我嘗試用自己的語言,來解釋它的設計思想。徹底說明白prototype對象到底是怎么回事。其實根本就沒那么復雜,真相非常簡單。

一、從古代說起

要理解Javascript的設計思想,必須從它的誕生說起。

1994年,網景公司(Netscape)發布了Navigator瀏覽器0.9版。這是歷史上***個比較成熟的網絡瀏覽器,轟動一時。但是,這個版本的瀏覽器只能用來瀏覽,不具備與訪問者互動的能力。

比如,如果網頁上有一欄"用戶名"要求填寫,瀏覽器就無法判斷訪問者是否真的填寫了,只有讓服務器端判斷。如果沒有填寫,服務器端就返回錯誤,要求用戶重新填寫,這太浪費時間和服務器資源了。

因此,網景公司急需一種網頁腳本語言,使得瀏覽器可以與網頁互動。工程師Brendan Eich負責開發這種新語言。他覺得,沒必要設計得很復雜,這種語言只要能夠完成一些簡單操作就夠了,比如判斷用戶有沒有填寫表單。

1994年正是面向對象編程(object-oriented programming)最興盛的時期,C++是當時***的語言,而Java語言的1.0版即將于第二年推出,Sun公司正在大肆造勢。

Brendan Eich無疑受到了影響,Javascript里面所有的數據類型都是對象(object),這一點與Java非常相似。但是,他隨即就遇到了一個難題,到底要不要設計"繼承"機制呢?

二、Brendan Eich的選擇

如果真的是一種簡易的腳本語言,其實不需要有"繼承"機制。但是,Javascript里面都是對象,必須有一種機制,將所有對象聯系起來。所以,Brendan Eich***還是設計了"繼承"。

但是,他不打算引入"類"(class)的概念,因為一旦有了"類",Javascript就是一種完整的面向對象編程語言了,這好像有點太正式了,而且增加了初學者的入門難度。

他考慮到,C++和Java語言都使用new命令,生成實例。

C++的寫法是:

  1. ClassName *object = new ClassName(param); 

Java的寫法是:

  1. Foo foo = new Foo(); 

因此,他就把new命令引入了Javascript,用來從原型對象生成一個實例對象。但是,Javascript沒有"類",怎么來表示原型對象呢?

這時,他想到C++和Java使用new命令時,都會調用"類"的構造函數(constructor)。他就做了一個簡化的設計,在Javascript語言中,new命令后面跟的不是類,而是構造函數。

舉例來說,現在有一個叫做DOG的構造函數,表示狗對象的原型。

  1. function DOG(name)  
  2. {  
  3. this.name = name;  

對這個構造函數使用new,就會生成一個狗對象的實例。

  1. var dogA = new DOG('大毛');  
  2. alert(dogA.name); // 大毛 

注意構造函數中的this關鍵字,它就代表了新創建的實例對象。

三、new運算符的缺點

用構造函數生成實例對象,有一個缺點,那就是無法共享屬性和方法。

比如,在DOG對象的構造函數中,設置一個實例對象的共有屬性species。

  1. function DOG(name)  
  2. {  
  3. this.name = name;  
  4. this.species = '犬科';  

然后,生成兩個實例對象:

  1. var dogA = new DOG('大毛');  
  2. var dogB = new DOG('二毛'); 

這兩個對象的species屬性是獨立的,修改其中一個,不會影響到另一個。

  1. dogA.species = '貓科';  
  2. alert(dogB.species); // 顯示"犬科",不受dogA的影響 

每一個實例對象,都有自己的屬性和方法的副本。這不僅無法做到數據共享,也是極大的資源浪費。

四、prototype屬性的引入

考慮到這一點,Brendan Eich決定為構造函數設置一個prototype屬性。

這個屬性包含一個對象(以下簡稱"prototype對象"),所有實例對象需要共享的屬性和方法,都放在這個對象里面;那些不需要共享的屬性和方法,就放在構造函數里面。

實例對象一旦創建,將自動引用prototype對象的屬性和方法。也就是說,實例對象的屬性和方法,分成兩種,一種是本地的,另一種是引用的。

還是以DOG構造函數為例,現在用prototype屬性進行改寫:

  1. function DOG(name){  
  2. this.name = name;  
  3. }  
  4. DOG.prototype = { species : '犬科' };  
  5. var dogA = new DOG('大毛');  
  6. var dogB = new DOG('二毛');  
  7. alert(dogA.species); // 犬科  
  8. alert(dogB.species); // 犬科 

現在,species屬性放在prototype對象里,是兩個實例對象共享的。只要修改了prototype對象,就會同時影響到兩個實例對象。

  1. DOG.prototype.species = '貓科';   
  2. alert(dogA.species); // 貓科  
  3. alert(dogB.species); // 貓科 

五、總結

由于所有的實例對象共享同一個prototype對象,那么從外界看起來,prototype對象就好像是實例對象的原型,而實例對象則好像"繼承"了prototype對象一樣。

這就是Javascript繼承機制的設計思想。不知道說清楚了沒有,繼承機制的具體應用方法,可以參考有關的系列文章:

原文地址:http://www.ruanyifeng.com/blog/2011/06/designing_ideas_of_
inheritance_mechanism_in_javascript.html

【編輯推薦】

  1. Javascript中閉包的作用域鏈
  2. Javascript的興起是否意味著LAMP的終結?
  3. Web移動應用 HTML5 CSS和JavaScript
  4. Javascript閉包(closure) 深入淺出
  5. 如何判斷Javascript對象是否存在
責任編輯:于鐵 來源: 阮一峰的博客
相關推薦

2011-08-24 13:51:56

JavaScript

2011-07-26 15:30:32

jQuery

2011-05-25 16:23:35

Javascript類繼承

2012-02-14 09:45:02

JavaScript

2011-08-31 14:48:33

JavaScript

2013-09-18 14:01:46

JavaScript

2010-05-05 17:45:12

IBM Unix

2011-08-24 13:56:27

JavaScript

2011-03-10 14:19:56

JavaScript

2021-12-04 11:17:32

Javascript繼承編程

2012-06-12 09:21:53

JavaScript

2024-11-14 11:00:00

Python繼承機制

2011-07-14 11:08:30

C#繼承

2011-09-01 10:21:52

jQuery Mobi元素

2012-04-01 10:14:27

linuxunix

2009-07-19 10:32:44

2011-03-11 17:07:16

2021-08-02 07:57:03

設計系統客戶端

2009-04-23 10:33:52

ASP.NET設計思想微軟

2024-08-23 08:56:59

點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 久草福利| 2019天天操 | 自拍 亚洲 欧美 老师 丝袜 | 成人在线播放 | 成人三区四区 | 日韩乱码在线 | 亚洲乱码国产乱码精品精98午夜 | 久久久久久久久久久福利观看 | 亚洲美女一区二区三区 | 日韩欧美在线观看视频 | 免费一区二区三区 | 亚洲高清一区二区三区 | 日韩在线观看 | 精品99在线 | www.一区二区 | 久久精品国产一区二区三区 | 欧美亚州综合 | 国产高潮好爽受不了了夜色 | 欧美最猛黑人 | 国产精品观看 | 午夜久久久久久久久久一区二区 | 国产东北一级毛片 | 欧美一区二区三区久久精品 | 日本精品久久久一区二区三区 | av手机免费在线观看 | 欧美日韩一区在线观看 | 99tv| www免费视频| 精品久久久久久久久久久院品网 | 免费av在线网站 | 一区二区三区欧美 | 色综合久久天天综合网 | 99热热| 免费99精品国产自在在线 | 黄色成人亚洲 | 国产在线小视频 | 97成人在线 | 99国产精品99久久久久久 | 久久99精品国产麻豆婷婷 | 自拍偷拍欧美 | 婷婷五月色综合香五月 |