最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

基于JavaScript實現繼承機制之原型鏈(prototype chaining)的詳解

 更新時間:2013年05月07日 16:49:08   作者:  
我們知道在JavaScript中定義類的原型方式,而原型鏈擴展了這種方式,以一種有趣的方式實現繼承機制。prototype 對象是個模板,要實例化的對象都以這個模板為基礎??偠灾?,prototype 對象的任何屬性和方法都被傳遞給那個類的所有實例。原型鏈利用這種功能來實現繼承機制

如果用原型方式重定義前面例子中的類,它們將變?yōu)橄铝行问剑?BR>

復制代碼 代碼如下:

function ClassA() {
}

ClassA.prototype.color = "blue";
ClassA.prototype.sayColor = function () {
    alert(this.color);
};

function ClassB() {
}

ClassB.prototype = new ClassA();


原型方式的神奇之處在于最后一行代碼。這里,把 ClassB 的 prototype 屬性設置成 ClassA 的實例。這很有意思,因為想要 ClassA 的所有屬性和方法,但又不想逐個將它們 添加到ClassB 的 prototype 屬性。還有比把 ClassA 的實例賦予 prototype 屬性更好的方法嗎?

注意:調用 ClassA 的構造函數,沒有給它傳遞參數。這在原型鏈中是標準做法。要確保構造函數沒有任何參數。

與對象冒充相似,子類的所有屬性和方法都必須出現在 prototype 屬性被賦值后,因為在它之前賦值的所有方法都會被刪除。為什么?因為 prototype 屬性被替換成了新對象,添加了新方法的原始對象將被銷毀。所以,為 ClassB 類添加 name 屬性和 sayName() 方法的代碼如下:

復制代碼 代碼如下:

function ClassB() {
}

ClassB.prototype = new ClassA();

ClassB.prototype.name = "";
ClassB.prototype.sayName = function () {
    alert(this.name);
};


可通過運行下面的例子測試這段代碼:
復制代碼 代碼如下:

var objA = new ClassA();
var objB = new ClassB();
objA.color = "blue";
objB.color = "red";
objB.name = "John";
objA.sayColor();
objB.sayColor();
objB.sayName();

此外,在原型鏈中,instanceof 運算符的運行方式也很獨特。對 ClassB 的所有實例,instanceof 為 ClassA 和 ClassB 都返回 true。例如:
復制代碼 代碼如下:

var objB = new ClassB();
alert(objB instanceof ClassA);    //輸出 "true"
alert(objB instanceof ClassB);    //輸出 "true"

在 ECMAScript 的弱類型世界中,這是極其有用的工具,不過使用對象冒充時不能使用該方法判斷。但是由于子類的原型被直接重新賦值,所以出現以下這種情況:
復制代碼 代碼如下:

console.log(objB.__proto__===objB.constructor.prototype)   //false

因為ClassB的原型鏈 prototype 屬性被另一個類的對象重寫了。輸出結果可以看出objB.__proto__仍然指向的是ClassB.prototype,而不是objB.constructor.prototype。這也很好理解,給Person.prototype賦值的是一個對象直接量new ClassA()實例,使用對象直接量方式定義的對象其構造器(constructor)指向的是根構造器Object,Object.prototype是一個空對象{},{}自然與ClassB.prototype不等。

相關文章

  • 深入理解選擇框腳本[推薦]

    深入理解選擇框腳本[推薦]

    選擇框是通過<select>和<option>元素創(chuàng)建的,又稱為下拉列表框。為了方便與這個控件交互,除了所有表單字段共有的屬性和方法外,javascript還提供了一些屬性和方法。本文將詳細介紹選擇框腳本
    2016-12-12
  • 利用Query+bootstrap和js兩種方式實現日期選擇器

    利用Query+bootstrap和js兩種方式實現日期選擇器

    日期選擇器在我們平時開發(fā)的時候經常要用到,下面這篇文章主要給大家介紹了利用Query+bootstrap和js這兩種方式實現日期選擇器的方法,文中兩種方法都給出了詳細的示例代碼,有需要的朋友可以參考借鑒,下面來一起看看吧。
    2017-01-01
  • 兼容IE,firefox的獲取節(jié)點的文本值的javascript代碼

    兼容IE,firefox的獲取節(jié)點的文本值的javascript代碼

    javascript獲取節(jié)點的文本值,已經考慮了兼容性。大家可以放心使用。注意了這里的兼容沒有使用innerText,如果要使用兼容innerText,請參考腳本之家以前發(fā)布的文章。
    2009-12-12
  • JavaScript對象之深度克隆介紹

    JavaScript對象之深度克隆介紹

    這篇文章主要介紹了JavaScript對象之深度克隆介紹,本文詳細的講解了什么是對象深度克隆,并給出了示例代碼,需要的朋友可以參考下
    2014-12-12
  • JavaScript DOM 編程藝術(第2版)讀書筆記(JavaScript的最佳實踐)

    JavaScript DOM 編程藝術(第2版)讀書筆記(JavaScript的最佳實踐)

    閱讀了本書第五章關于使用JavaScript的最佳實踐,大部分的建議之前都有耳聞,不過閱讀之后有更深的體會
    2013-10-10
  • 按鈕JS復制文本框和表格的代碼

    按鈕JS復制文本框和表格的代碼

    有時候我們需要復制一個框的內容或者整個表格,一般的操作很可能造成一些不方便,一是操作步驟較為復制,一是復制表格的時候容易復制不完整或者格式出錯。
    2011-04-04
  • Javascript中String的常用方法實例分析

    Javascript中String的常用方法實例分析

    這篇文章主要介紹了Javascript中String的常用方法,實例分析了String常用的字符轉換、截取、分割等技巧,需要的朋友可以參考下
    2015-06-06
  • js學習總結_基于數據類型檢測的四種方式(必看)

    js學習總結_基于數據類型檢測的四種方式(必看)

    下面小編就為大家?guī)硪黄猨s學習總結_基于數據類型檢測的四種方式(必看)。小編覺得挺不錯的,現在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • JavaScript 異步調用框架 (Part 2 - 用例設計)

    JavaScript 異步調用框架 (Part 2 - 用例設計)

    在上一篇文章里說到,我們要設計一個異步調用框架,最好能夠統一同步異步調用的接口,同時具體調用順序與實現方式無關。那么我們現在就來設計這樣一個框架的用例。
    2009-08-08
  • js獲取多個tagname的節(jié)點數組

    js獲取多個tagname的節(jié)點數組

    寫了個獲取多個tagname節(jié)點集合的小方法。類似于jQuery的$(‘iput,select,textarea’,'#form’)的效果,返回是按節(jié)點在原有文檔流中的順序返回的
    2013-09-09

最新評論

高密市| 宁化县| 刚察县| 元朗区| 咸宁市| 抚远县| 南皮县| 丹凤县| 仪征市| 禄丰县| 仁化县| 和硕县| 凌海市| 营山县| 通州区| 来凤县| 应用必备| 沧州市| 黑水县| 方山县| 宁阳县| 邯郸市| 尼玛县| 江城| 柘城县| 万山特区| 沂水县| 永胜县| 施秉县| 武乡县| 德惠市| 肇东市| 石首市| 修武县| 雷波县| 内黄县| 松原市| 牟定县| 曲周县| 静乐县| 靖远县|