国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

JavaScript 原型與繼承說明

2019-11-21 00:26:25
字體:
供稿:網(wǎng)友
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); 

因?yàn)樵蛯ο蟮乃袑傩阅鼙粯?gòu)造函數(shù)創(chuàng)建對象共享,所以創(chuàng)建的對象可以訪問這里的constructor屬性,同時obj對應(yīng)的就是原型對象(prototype)所創(chuàng)建出來的一個實(shí)例,那么重寫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并沒有被改變,因此無論在一個對象加入或修改多少屬性這都不影響其原型對象中屬性的本來面目,其實(shí)很容易理解js為什么這樣做,因?yàn)橐粋€對象的行為不能影響到其他對象,否則將會造成混亂。

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

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

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

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

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ù)中進(jìn)行執(zhí)行。然后,我們同樣需要由B函數(shù)構(gòu)造出來的對象需要包含A函數(shù)的所有特性,因此需要加上這么一句話。

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

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();

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

發(fā)表評論 共有條評論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 陆良县| 遂川县| 林西县| 怀仁县| 江门市| 罗源县| 始兴县| 汕头市| 奇台县| 澄迈县| 青河县| 朔州市| 南皮县| 黑山县| 濮阳市| 衢州市| SHOW| 沙雅县| 正安县| 乌兰浩特市| 祁东县| 林甸县| 英德市| 沁源县| 绩溪县| 中江县| 东丽区| 哈密市| 鄂温| 阿巴嘎旗| 丹东市| 元江| 沙田区| 竹山县| 厦门市| 长沙县| 德钦县| 沧源| 赤峰市| 北宁市| 苏尼特左旗|