JavaScript:原型和繼承(下篇)

來源:互聯網
上載者:User

① 讀取和寫入繼承的屬性

每個類都有一個帶有一組屬性的原型對象。但是,一個類有很多的潛在的執行個體,每個執行個體都繼承這些原型屬性。由於一個原型屬性可以被很多個物件繼承,JavaScript必須在讀取和寫入屬性值的時候,執行一種基本的不對稱。當讀取對象o的屬性p的時候,JavaScript首先檢查o是否有一個名為p的屬性。如果沒有,它接下來檢查o的原型對象是否有一個名為p的屬性。這使得基於原型的繼承能夠奏效。

另一方面,當寫入一個屬性值的時候,JavaScript不會使用原型對象。要探究其原因,可以考慮如果它這麼做的話會發生什麼。假設要設定屬性o.p的值,而對象o沒有一個名為p的屬性。進一步假設JavaScript繼續前進並尋找到屬性p在o的原型對象中,並且允許設定該原型的屬性。現在,已經改變了整個一類對象的p的值,而這並非本意。因此屬性繼承只在讀取屬性值的時候發生,而當寫入屬性值的時候不會發生。如果設定了一個對象o的p屬性,而p屬性是o從它的原型那裡繼承而來的,那麼所發生的只不過是直接在o中建立了一個新的p屬性。既然o有了自己的名為p的屬性,它不再從自己的原型中繼承p的值。當讀取p的值的時候,JavaScript首先查看o的屬性,既然它發現p定義於o中,它就不需要尋找原型對象,也就不會找到定義於原型中的p屬性的值。我們有時候說,o的屬性p遮蓋或隱藏了原型對象中的屬性p。原型繼承可能是一個容易混淆的話題,解釋了我們討論的概念。

圖片上傳失敗,網速優時補上。

由於原型屬性是由一個類的所有對象共用的屬性,所以通常,使用它們來定義對於類中的所有對象來說都相同的屬性,才顯得有意義。這使得原型成為定義方法的理想工具。具有不變的值(如數學常量)的其他屬性也很適合用原型屬性來定義。如果類定義了一個屬性,它經常使用一個預設值,那麼可以在一個原型對象中定義這個屬性及其預設值。少數不想使用預設值的對象,可以自己建立該屬性的私人的非共用的拷貝,並定義它們為自己的非預設的值。

② 擴充內建類型

不僅使用者定義的類有原型對象。像String和Date這樣的內建的類,也有原型對象,並且可以為它們賦值。例如如下的代碼定義了一個在所有的String對象中都可用的方法:

String.prototype.endsWith=function(c){return (c==this.charAt(this.length-1))}

在String原型對象中定義了新的endsWith( )方法後,可以像下面這樣使用它:

var message="hello world";message.endsWith('h');  //falsemessage.endsWith('d');  //true

反對使用自己的方法來擴充內建的類型。充足的理由是,如果這麼做,本質上建立了核心JavaScript API的自己的定製版本。如果該程式碼封裝含了人們沒有聽說過的方法,那些必須閱讀和維護該代碼的任何其他程式員都可能會覺得代碼太另人混淆了。除非建立一個底層的JavaScript幀並且期望很多其他的程式員都採用該幀,負責最好還是對內建類型的原型對象敬而遠之。

注意絕對不能為Object.prototype添加屬性。所添加的任何屬性和方法都可以用一個for/in迴圈來枚舉,將它們添加到Object.prototype就會使它們在每個單個的JavaScript對象中都可見。一個空的對象{}應該沒有可枚舉的屬性。任何添加到Object.prototype的內容都變成這個Null 物件的一個可枚舉屬性,那麼把對象用作關聯陣列的代碼可能會產生問題。

這裡展示的擴充內建物件類型的技術,只能保證對核心JavaScript的本機物件起作用。當JavaScript嵌入到其他環境,如一個web瀏覽器或者一個Java應用程式中,它就訪問了另外的宿主對象,如代表web瀏覽器文檔內容的對象。這些宿主對象一般都沒有建構函式和原型對象,通常無法擴充它們。

在一種情況下,擴充一個內建的本地類的原型是安全而有用的,這就是當一箇舊的或不相容的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.