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

首頁 > 語言 > JavaScript > 正文

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

2024-05-06 15:48:05
字體:
來源:轉載
供稿:網友
我們知道在JavaScript中定義類的原型方式,而原型鏈擴展了這種方式,以一種有趣的方式實現繼承機制。prototype 對象是個模板,要實例化的對象都以這個模板為基礎??偠灾琾rototype 對象的任何屬性和方法都被傳遞給那個類的所有實例。原型鏈利用這種功能來實現繼承機制

如果用原型方式重定義前面例子中的類,它們將變為下列形式:

復制代碼 代碼如下:


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不等。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 米泉市| 壶关县| 宁乡县| 东港市| 潮安县| 台江县| 射阳县| 富民县| 西丰县| 松原市| 全椒县| 福泉市| 蒙城县| 琼中| 昌平区| 连州市| 民丰县| 蚌埠市| 寿宁县| 防城港市| 乳山市| 凭祥市| 澄江县| 舟曲县| 曲周县| 乐亭县| 安西县| 五寨县| 呼图壁县| 云龙县| 南雄市| 山东省| 黑河市| 江口县| 忻州市| 柘城县| 郁南县| 成安县| 方山县| 增城市| 天津市|