首頁 >web前端 >js教程 >JavaScript原型鏈prototype屬性與方法實例詳解

JavaScript原型鏈prototype屬性與方法實例詳解

伊谢尔伦
伊谢尔伦原創
2017-07-25 16:04:391968瀏覽

prototype 物件的任何屬性和方法都會傳遞給那個類別的所有實例。原型鏈利用這種功能來實現繼承機制,如果用原型方式重定義前面例子中的類,它們將變為下列形式:

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

以上是JavaScript原型鏈prototype屬性與方法實例詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn