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

JavaScript中的幾個關(guān)鍵概念的理解-原型鏈的構(gòu)建

 更新時間:2011年05月12日 00:21:45   投稿:mdxy-dxy  
JavaScript中的prototype,標準翻譯為“原型”,表示對象的初始形態(tài)

Javascript中所有function中都有一個prototype屬性,并且這個prototype屬性是一個object類型的對象,所有由該function構(gòu)造出來的對象都具有這個prototype上的特性,也就是說可以用構(gòu)造出來的對象直接訪問prototype上的屬性和方法。
下面一段代碼演示prototype的使用方法:

復(fù)制代碼 代碼如下:

function Staff(name) {
this.name = name;
}
Staff.prototype.say = function() {
alert(this.name + " say hello");
}
var staff1 = new Staff("hunter");
var staff2 = new Staff("dangjian");
staff1.say();
staff2.say();

運行如上的程序,可知prototype上的屬性和方法可以通過創(chuàng)建的對象之間調(diào)用,更重要的是prototype中的屬性和方法是在同類型的對象中是共享的
復(fù)制代碼 代碼如下:
alert( staff1.say == staff2.say);


prototype另外一個常用的特性是通過prototype構(gòu)建對象的繼承關(guān)系,通過把基類對象賦給子類的prototype的方式可以模擬面向?qū)ο笾械睦^承關(guān)系,這就是大家經(jīng)常說的JavaScript的面向?qū)ο髾C制。如下的代碼段演示了利用這一特性構(gòu)建對象的繼承關(guān)系:
復(fù)制代碼 代碼如下:

function Staff(name) { // 基類
this.name = name;
}
Staff.prototype.say = function() {
alert(this.name + " say hello");
}
function ManStaff(name, age) { // 子類
this.name = name;
this.age = age;
}
ManStaff.prototype = new Staff(); // 建立繼承關(guān)系
var manStaff1 = new ManStaff("hunter", 22);
var manStaff2 = new ManStaff("dangjian", 32);
manStaff1.say();
manStaff2.say();

運行代碼可知,ManStaff對象中具有了基類Staff中的Say方法,這種繼承方式在JavaScript中是通過prototype鏈來實現(xiàn)的。大家可能熟悉以上的prototype用法,可是作為程序員,我們不光要知道其用法,我們更應(yīng)該理解其可是prototype的內(nèi)部機制。下面我們來分析prototype的原理以及prototype鏈的實現(xiàn)。
要理解prototype的機制就必須要了解JavaScript中function的創(chuàng)建方式。
當(dāng)代碼執(zhí)行到function Staff(name) {this.name = name;}時,相當(dāng)于執(zhí)行var Staff = new Function(“name”, "this.name = name”)解釋器將使用預(yù)定義好的Function() constructor,來創(chuàng)建一個function類型的object出來,即Staff。

隨后給創(chuàng)建好的Staff對象添加__proto__屬性,并賦值為Function的構(gòu)造器的prototype,這一步是所有對象創(chuàng)建過程中都有的步驟,在執(zhí)行類似var x = new X()方式是,都會把X的prototype賦值給x的__proto__,類似如下的賦值:
復(fù)制代碼 代碼如下:

Staff.__proto__ = Function.prototype;

接下來給Staff創(chuàng)建prototype屬性,這一步是創(chuàng)建function類型的對象具有的步驟,創(chuàng)建的過程如下偽代碼:
復(fù)制代碼 代碼如下:

var o = new Object();
o.constructor = Base;
Staff.prototype = o;

如上的分析我們可知,當(dāng)創(chuàng)建對象時,會創(chuàng)建一個私有屬性__proto__,當(dāng)創(chuàng)建function是會創(chuàng)建一個prototype屬性。因為Staff是一個function類型的對象,所以會同時具有這兩個屬性。
這兩個屬性是構(gòu)建原型鏈的關(guān)鍵屬性。我們來分析執(zhí)行代碼 var staff1 = new Staff(“hunter”)時,原型是如何傳遞的。
根據(jù)如上分析,staff1.__proto__ = Staff.prototype,而Staff.prototype又是一個由Object創(chuàng)建的對象,即Staff.prototype.__proto__ = Object.prototype,所以staff1.__proto__ .__proto__ 指向的是Object.prototype,即staff1.__proto__ .__proto__ == Object.prototype,這就是原型鏈,當(dāng)要讀取某個對象的屬性時,JS首先找對象本身是否有這個屬性,如果沒有就會順著原型鏈一直尋找這個屬性。
知道了原型鏈的原理,那么就很容易根據(jù)這個原理來構(gòu)建Javascript中的對象繼承。
由如上的分析,我們可知原型鏈的頂端都是Object.prototype,這就意味著在構(gòu)建的繼承關(guān)系中Object是所有對象的基類,可以運行如下的代碼驗證。
復(fù)制代碼 代碼如下:

Object.prototype.location = "China";
function Staff(name) { // 基類
this.name = name;
}
Staff.prototype.say = function() {
alert(this.name + " say hello");
}
var ManStaff1 = new Staff("hunter");
var ManStaff2 = new Staff("dangjian");
alert(ManStaff1.location);
alert(ManStaff2.location);

運行結(jié)果知道,Object是Staff的基類,那么要如何構(gòu)建一個Staff的子類呢?
理解了上面函數(shù)的建立原理,我們很容易寫出如下的代碼:
復(fù)制代碼 代碼如下:

function Staff(name) { // 基類
this.name = name;
}
Staff.prototype.say = function() {
alert(this.name + " say hello");
}
function ManStaff(name, age) { // 子類
Staff.call(this,name);
this.age = age;
}
ManStaff.prototype = new Staff(); // 建立繼承關(guān)系
var ManStaff1 = new ManStaff("hunter", 22);
var ManStaff2 = new ManStaff("dangjian", 32);
ManStaff1.say();
ManStaff2.say();

建立繼承關(guān)系的就是這句:ManStaff.prototype = new Staff(); ,繼承關(guān)系推算如下:ManStaff1.__proto__ = =ManStaff.prototype, ManStaff.prototype.__proto__ = Staff.prototype, Staff.prototype.__proto__ == Object.prototype;則ManStaff1.__proto__.__proto__.__proto__ == Object.prototype。
javascript中的這種繼承關(guān)系比較傳統(tǒng)面向?qū)ο蟮睦^承關(guān)系更松散,構(gòu)建方式也比較難以理解,但是作為腳本語言,其功能已經(jīng)是非常強大了。

相關(guān)文章

  • Js callBack 返回前一頁的js方法

    Js callBack 返回前一頁的js方法

    通過 window.opener 實現(xiàn)。關(guān)于這個對象的用法請查閱相關(guān)資料。
    2008-11-11
  • JS如何使用正則表達式(match)截取括號中的文字和數(shù)字

    JS如何使用正則表達式(match)截取括號中的文字和數(shù)字

    正則表達式是一種用來匹配文本模式的工具,這篇文章主要給大家介紹了關(guān)于JS如何使用正則表達式(match)截取括號中文字和數(shù)字的相關(guān)資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-10-10
  • JavaScript實現(xiàn)簡易計算器小功能

    JavaScript實現(xiàn)簡易計算器小功能

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)簡易計算器小功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Javascript中With語句用法實例

    Javascript中With語句用法實例

    這篇文章主要介紹了Javascript中With語句用法,實例分析了javascript中with語句的相關(guān)使用方法,類似VB語句的用法,需要的朋友可以參考下
    2015-05-05
  • 小程序按鈕避免多次調(diào)用接口和點擊方案實現(xiàn)(不用showLoading)

    小程序按鈕避免多次調(diào)用接口和點擊方案實現(xiàn)(不用showLoading)

    這篇文章主要介紹了小程序按鈕避免多次調(diào)用接口和點擊方案實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • javascript操作向表格中動態(tài)加載數(shù)據(jù)

    javascript操作向表格中動態(tài)加載數(shù)據(jù)

    這篇文章主要為大家詳細介紹了javascript操作向表格中動態(tài)加載數(shù)據(jù),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-08-08
  • javascript實現(xiàn)回到頂部特效

    javascript實現(xiàn)回到頂部特效

    當(dāng)頁面特別長的時候,用戶想回到頁面頂部,必須得滾動好幾次滾動鍵才能回到頂部,如果在頁面右下角有個“返回頂部”的按鈕,用戶點擊一下,就可以回到頂部,對于用戶來說,是一個比較好的體驗。
    2015-05-05
  • JS中Date的一些常用方法小結(jié)

    JS中Date的一些常用方法小結(jié)

    Data()日期對象是一個構(gòu)造函數(shù),必須使用new來調(diào)用創(chuàng)建我們的日期對象,下面這篇文章主要給大家介紹了關(guān)于JS中Date的一些常用方法,需要的朋友可以參考下
    2022-10-10
  • li隔行換色效果代碼升級版

    li隔行換色效果代碼升級版

    增加了對同一ID內(nèi)的多個子容器中的tag(標簽)分別做隔行處理。div+css布局下,也可以控制了
    2008-05-05
  • js動態(tài)生成Html元素實現(xiàn)Post操作(createElement)

    js動態(tài)生成Html元素實現(xiàn)Post操作(createElement)

    這篇文章主要介紹了js動態(tài)生成Html元素實現(xiàn)Post操作(createElement),需要的朋友可以參考下
    2015-09-09

最新評論

互助| 和静县| 西藏| 栖霞市| 曲沃县| 城固县| 胶州市| 毕节市| 博乐市| 崇文区| 二连浩特市| 眉山市| 布尔津县| 白沙| 建阳市| 平邑县| 蓬溪县| 电白县| 楚雄市| 平舆县| 阿克陶县| 乡宁县| 阜新| 三河市| 长武县| 松滋市| 成安县| 沾益县| 松原市| 仁布县| 扬州市| 南陵县| 通海县| 滨海县| 邵东县| 肥西县| 乐至县| 万荣县| 阳山县| 岐山县| 邮箱|