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

JavaScript 原型與繼承說明

 更新時間:2010年06月09日 01:13:09   投稿:mdxy-dxy  
在上一遍我們簡單的介紹了怎么樣使用JavaScript進行構(gòu)造函數(shù)的書寫,現(xiàn)在來認識下JavaScript的構(gòu)造函數(shù)其原理,主要是關注與原型的概念,首先看如下代碼。
function A(x) 
{ 
this.x = x; 
} 
alert(A.prototype); 
alert(A.prototype.constructor);

根據(jù)彈出的結(jié)果,我們可以得到:原型對象是由函數(shù)的構(gòu)造函數(shù)創(chuàng)建,它所擁有的屬性能被所有對象共享,初始時原型對象指向一個Object對象,并且定義了一個constructor屬性,該屬性指向定義該原型對象的構(gòu)造函數(shù)本身,再看如下代碼。

Code

function A(x) 
{ 
A.prototype.x = x; 
} 
var obj = new A(10); 
alert(obj.x); 
alert(obj.constructor); 

因為原型對象的所有屬性能被構(gòu)造函數(shù)創(chuàng)建對象共享,所以創(chuàng)建的對象可以訪問這里的constructor屬性,同時obj對應的就是原型對象(prototype)所創(chuàng)建出來的一個實例,那么重寫constructor屬性會出現(xiàn)什么樣的結(jié)果呢?

Code

function A(x) 
{ 
A.prototype.x = x; 
} 

var objA = new A(10); 
objA.constructor = function(x){ alert("重寫obj的constructor屬性");this.x = 20 }; 
objA.constructor(); 
alert(objA.x); 

var objB = new A(10); 
alert(objB.x);

根據(jù)結(jié)果我們可以看到,首先彈出的是“重寫obj的constructor屬性”,然后彈出20,在彈出10,可見,我們在書寫重寫objA這個對象的constructor之后,objB并沒有被改變,因此無論在一個對象加入或修改多少屬性這都不影響其原型對象中屬性的本來面目,其實很容易理解js為什么這樣做,因為一個對象的行為不能影響到其他對象,否則將會造成混亂。

在這里,我們可以總結(jié)一下,上面代碼的規(guī)則:

1.當我們調(diào)用某個對象的時候,首先檢查該對象本身的自己定義的屬性,如果存在則調(diào)用。

2.當自己本身的屬性不存在的時候,則調(diào)用其構(gòu)造函數(shù)所定義的原型對象的引用。

那么根據(jù)這個規(guī)則,就形成了JavaScript中的一個原型鏈,我們就可以根據(jù)這個規(guī)則來定義繼承關系。

function A(x) 
{ 
A.prototype.x = x; 
} 

function B(x,y) 
{ 
B.prototype.y = y; 
A.call(this,x); 
}

這段代碼顯示了兩個函數(shù),B函數(shù)繼承與A函數(shù),A.call(this.x)表示,將B的對象this傳遞到A函數(shù)中進行執(zhí)行。然后,我們同樣需要由B函數(shù)構(gòu)造出來的對象需要包含A函數(shù)的所有特性,因此需要加上這么一句話。

復制代碼 代碼如下:

B.prototype = new A();
alert(B.prototype.constructor);

先我們指定B的原型為A,因此,B函數(shù)繼承了A函數(shù)的特性,根據(jù)彈出的結(jié)果,我們可以看到,其constructor指向的是A函數(shù),那么我們的B函數(shù)的特性是不是丟失了呢?因此,我們需要在加上一句話,最后給出繼續(xù)的整合代碼。

function A(x) 
{ 
A.prototype.x = x; 
A.prototype.ShowA = function(){ alert("A的Show方法!"); }; 
} 

function B(x,y) 
{ 
B.prototype.y = y; 
A.call(this,x); 
B.prototype.ShowB = function(){ alert("B的Show方法!"); }; 
} 

B.prototype = new A(); 
B.prototype.constructor = B; 

var obj = new B(10,5); 
alert(obj.x); 
alert(obj.y); 
obj.ShowA(); 
obj.ShowB();

若有疑問或不正之處,歡迎提出指正和討論。

相關文章

  • JavaScript 繼承詳解(三)

    JavaScript 繼承詳解(三)

    在第一章中,我們使用構(gòu)造函數(shù)和原型的方式在JavaScript的世界中實現(xiàn)了類和繼承, 但是存在很多問題。這一章我們將會逐一分析這些問題,并給出解決方案。
    2009-07-07
  • JavaScript為對象原型prototype添加屬性的兩種方式

    JavaScript為對象原型prototype添加屬性的兩種方式

    為對象原型prototype添加屬性的的方法, 需要的朋友可以參考下。
    2010-08-08
  • javscript對象原型的一些看法

    javscript對象原型的一些看法

    javscript對象原型的小技巧。學習js面向?qū)ο蟮呐笥芽梢詤⒖枷隆?/div> 2010-09-09
  • JavaScript 面向?qū)ο笕腴T精簡篇

    JavaScript 面向?qū)ο笕腴T精簡篇

    圍繞面向?qū)ο蟮膸状箨P鍵字:封裝 ,繼承 ,多態(tài) ,展開JavaScript面向?qū)ο?/div> 2009-03-03
  • 用JavaScript實現(xiàn)單繼承和多繼承的簡單方法

    用JavaScript實現(xiàn)單繼承和多繼承的簡單方法

    JavaScript是一種強大的多泛型編程語言,其融合了面向過程、面向?qū)ο蠛秃瘮?shù)式編程于一身,具備強大的表現(xiàn)能力。
    2009-03-03
  • 最新評論

    从化市| 且末县| 平邑县| 巴彦淖尔市| 宜丰县| 三原县| 开原市| 嘉祥县| 海丰县| 深圳市| 郸城县| 玛沁县| 杭锦后旗| 平邑县| 广饶县| 曲阜市| 屏山县| 威信县| 上林县| 连江县| 灯塔市| 开化县| 巴林右旗| 丰城市| 邢台县| 沅陵县| 广昌县| 苗栗县| 綦江县| 徐州市| 武清区| 永顺县| 夏河县| 台中市| 德惠市| 电白县| 河西区| 霍邱县| 泰和县| 利川市| 鞍山市|