基于JavaScript實現(xiàn)繼承機制之原型鏈(prototype chaining)的詳解
如果用原型方式重定義前面例子中的類,它們將變?yōu)橄铝行问剑?BR>
function ClassA() {
}
ClassA.prototype.color = "blue";
ClassA.prototype.sayColor = function () {
alert(this.color);
};
function ClassB() {
}
ClassB.prototype = new ClassA();
原型方式的神奇之處在于最后一行代碼。這里,把 ClassB 的 prototype 屬性設(shè)置成 ClassA 的實例。這很有意思,因為想要 ClassA 的所有屬性和方法,但又不想逐個將它們 添加到ClassB 的 prototype 屬性。還有比把 ClassA 的實例賦予 prototype 屬性更好的方法嗎?
注意:調(diào)用 ClassA 的構(gòu)造函數(shù),沒有給它傳遞參數(shù)。這在原型鏈中是標準做法。要確保構(gòu)造函數(shù)沒有任何參數(shù)。
與對象冒充相似,子類的所有屬性和方法都必須出現(xiàn)在 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 的弱類型世界中,這是極其有用的工具,不過使用對象冒充時不能使用該方法判斷。但是由于子類的原型被直接重新賦值,所以出現(xiàn)以下這種情況:
console.log(objB.__proto__===objB.constructor.prototype) //false
因為ClassB的原型鏈 prototype 屬性被另一個類的對象重寫了。輸出結(jié)果可以看出objB.__proto__仍然指向的是ClassB.prototype,而不是objB.constructor.prototype。這也很好理解,給Person.prototype賦值的是一個對象直接量new ClassA()實例,使用對象直接量方式定義的對象其構(gòu)造器(constructor)指向的是根構(gòu)造器Object,Object.prototype是一個空對象{},{}自然與ClassB.prototype不等。
相關(guān)文章
JS使用reduce()方法處理樹形結(jié)構(gòu)數(shù)據(jù)
這篇文章主要介紹了JS使用reduce()方法處理樹形結(jié)構(gòu)數(shù)據(jù),對樹形結(jié)構(gòu)數(shù)據(jù)感興趣的同學(xué),可以參考下2021-05-05JavaScript實現(xiàn)預(yù)覽本地上傳圖片功能完整示例
這篇文章主要介紹了JavaScript實現(xiàn)預(yù)覽本地上傳圖片功能,結(jié)合完整實例形式分析了javascript圖片預(yù)覽相關(guān)的格式正則驗證、瀏覽器判斷、頁面元素屬性動態(tài)操作相關(guān)實現(xiàn)技巧,需要的朋友可以參考下2019-03-03js實現(xiàn)目錄鏈接,內(nèi)容跟著目錄滾動顯示的簡單實例
下面小編就為大家?guī)硪黄猨s實現(xiàn)目錄鏈接,內(nèi)容跟著目錄滾動顯示的簡單實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2016-10-10