淺談JavaScript原型

來源:互聯網
上載者:User

標籤:this   type   如何   函數   ati   foo   inf   web   尋找   

  在JavaScript中,所有函數都會擁有一個叫做prototype的屬性,預設初始值為“空”對象(沒有自身屬性的對象)。

  1、原型屬性

  如下所示,簡單地定義一個函數:

    function foo(a, b){

      return a * b;

    }

  這時,就可以像訪問其他對象一樣訪問該函數的屬性,而這些屬性中就包括prototype屬性,它的初始值是一個“空”對象,

可以看成是:foo.prototype = {}。

  我們可以賦予這個Null 物件一些方法和屬性,這並不會對foo函數本身造成什麼影響,只有當foo()作為構造器(即建構函式)使用時,這些屬性才會起作用。

  下面來看看如何利用原型添加方法與屬性。

  2、利用原型添加方法與屬性以及使用原型的方法與屬性

  首先,構建一個具體的構造器函數Gadget():

1 function Gadget(name, color){2     this.name = name;3     this.color = color;4     this.whatAreYou = function(){5         return ‘I am a ‘ + this.color + ‘ ‘ + this.name;6     };7 }

  然後,利用構造器函數的prototype屬性來為其增加兩個屬性(price和rating)和一個方法(getInfo),

  方法一:

1 Gadget.prototype.price = 100;2 Gadget.prototype.rating= 3;3 Gadget.prototype.getInfo = function(){4     return ‘Rating: ‘ + this.rating + ‘, price: ‘ + this.price;5 };

  方法二:

1 Gadget.prototype = {2     price: 100,3     rating: 3,4     getInfo: function(){5         return ‘Rating: ‘ + this.rating + ‘, price: ‘ + this.price;6     }7 }

  現在,使用該構造器來建立對象並訪問之前定義的那些屬性和方法:

 1 //建立一個對象 2 var newtoy = new Gadget(‘webcam‘, ‘black‘); 3 //訪問之前定義的屬性 4 newtoy.name;    //輸出為 webcam 5  6 newtoy.color;     //輸出為 black 7  8 new.whatAreYou();    //輸出為 I am a black webcam 9 10 newtoy.price;    //輸出為 10011 12 newtoy.rating;    //輸出為 313 14 newtoy.getInfo();    //輸出為 Rating: 3, price: 100

  對於原型來說,最重要的一點就是它的“即時”性,由於JavaScript幾乎所有對象都是通過傳引用的方式來傳遞的,因此我們所建立的每個新對象實體中並沒有一份屬於自己原型副本,這也就意味著可以隨時修改prototype屬性,並且由同一構造器建立的所有對象的prototype屬性也會同時改變(甚至還會影響在修改之前就已經建立了的那些對象)。

  如果在此時繼續向上面例子中的原型再添加一些方法,即便newtoy對象在吸食添加的方法定義之前就已經被建立了,但newtoy對象依然可以訪問新增的方法。

  我們不僅可以在相關的原型對象中添加新的方法和屬性,甚至可以用自訂對象來完全替換掉原有的原型對象。但要注意,原型的聲明是有先後順序的,所以重寫的原型會切斷之前的原型。

 

  3、自身屬性與原型屬性

  回到上面的例子,首先來看看原型鏈的執行模式:當對象newtoy訪問某個屬性是,例如name屬性,JavaScript引擎會遍曆該對象的所有屬性,並尋找name屬性,如果找到了就會立即返回,因為構造器函數中,確實定義了這個屬性。而如果newtoy訪問的是price屬性,JavaScript引擎依然會查詢該對象的所有屬性,但是該對象中沒有rating屬性,此時指令碼引擎就會去查詢用於建立當前對象的構造器函數的原型(等價於直接存取 newtoy.constructor.prototype)。如果再原型中找到了該屬性,就立即返回。如果依然沒有找到,則會繼續搜尋其原型的原型,以此類推,知道搜尋到Object.prototype。

  如果對象的自身屬性與原型屬性同名,那麼返回的將是自身屬性設定的值,因為對象自身屬性的優先順序高於原型屬性。

  如果要判斷一個屬性時自身屬性還是原型屬性,可以使用 hasOwnProperty()方法來實現。若傳回值為true,則說明是對象的自身屬性;返回false,說明是對象的原型屬性。

 

  附上一本參考書:《JavaScript物件導向編程指南(第2版)》

淺談JavaScript原型

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.