JavaScript 中的多重繼承
JavaScript 是一種部分面向物件的語言。要使用它,需要理解其面向物件的特性。在本文中,我們將重點關注 JavaScript 中的多重繼承概念。
一個物件可以繼承自多個其他物件,即該物件具有來自多個父物件(而不僅僅是一個父物件)的公共屬性。在 JavaScript 中,可以透過將不同物件的屬性合併到一個物件中來實現這一點。讓我們看看錶示如何合併多個屬性的總體語法。
語法
讓我們考慮如下函式語法:
function multiple(...arguments) {
let objects = {};
for (all arg of arguments) {
objects = {
...object,
...arg
};
}
return objects;
}
上述語法可以像這樣使用:
const objects = multiple(
{ foo: 1 },
{ bar: 2 },
{ baz: 3 }
);
因此,我們可以傳遞多個物件,然後使用擴充套件運算子複製屬性。類似的工作可以使用 mixin 來完成。Mixin 是可以合併到其他物件中的一些物件。在建立物件時,我們可以選擇將哪些 mixin 合併到最終物件中。
寄生繼承
另一種特殊的繼承形式是寄生繼承。在這種型別的繼承中,我們獲取一些物件的所有功能,並將它們轉換為單個物件。以下示例將說明此概念:
示例
<!DOCTYPE html> <html> <head> <title>HTML Console</title> </head> <body> <h3> Output Console </h3> <p> Output: </p> <div id="output"> </div> <div id="opError" style="color : #ff0000"> </div> <script> var content = '' var error = '' var opDiv = document.querySelector('#output') var opErrDiv = document.querySelector('#opError') // actual javascript code try { function object(my_proto) { function F() { } F.prototype = my_proto; return new F(); } const base2D = { name: '2D region', dimensions: 2 }; function rect(base2D, w, h) { const obj = object(base2D); obj.name = 'rectangle'; obj.calculateArea = function () { return this.width * this.height; }; obj.width = w; obj.height = h; return obj; } function circ(base2D, r) { const obj = object(base2D); obj.name = 'circle'; obj.calculateArea = function () { return 3.14159 * this.rad * this.rad; }; obj.rad = r; return obj; } const rectObj = rect(base2D, 5, 7); content += "The rectangle object: " + JSON.stringify(rectObj) + '<br>' content += "The area of rectangle: " + JSON.stringify(rectObj.calculateArea()) + '<br>' const circObj = circ(base2D, 10); content += "The circle object: " + JSON.stringify(circObj) + '<br>' content += "The area of the circle: " + JSON.stringify(circObj.calculateArea()) + '<br>' } catch (err) { error += err } finally { // display on output console opDiv.innerHTML = content opErrDiv.innerHTML = error } </script> </body> </html>
在這個例子中,我們有一個函式 object(),它返回函式 F 的一個例項。然後建立 base2D 物件,它具有 name 和 dimension 屬性。我們可以使用此 dimension 屬性來檢查它是否為適當的型別。最後建立一個矩形物件。矩形物件本身是一個 2D 物件,它具有一些自己的屬性。因此,此物件獲取 base2D 物件以及 width 和 height 引數。另一個類似的物件 circ 也使用不同的引數集建立。圓形也屬於 2d 形狀類別,因此採用了 base2D 屬性。但是這裡另一個引數是半徑,其面積計算邏輯不同。
構造函數借用
實現多重繼承的另一種方法是借用建構函式。在這種方法中,父建構函式用於形成子建構函式。這可以透過以下示例來說明:
示例
function CustomShape(id) { this.id = id; } CustomShape.prototype.name = 'Shape'; CustomShape.prototype.toString = function() { return this.name; }; function SquareShape(id, name, side) { CustomShape.apply(this, [id]); this.name = name; this.side = side; } SquareShape.prototype = new CustomShape(); SquareShape.prototype.name = 'Square'; function CircleShape(id, name, rad) { CustomShape.apply(this, [id]); this.name = name; this.rad = rad; } CircleShape.prototype = new CustomShape(); CircleShape.prototype.name = 'Circle';
在此示例中,CustomShape 引數具有 id 屬性。我們透過呼叫 apply 函式來呼叫 CustomShape 建構函式。然後我們建立兩種型別。透過分配 CustomShape 物件的原型來建立 SquareShape 和 CircleShape。'name' 欄位在所有 SquareShape 物件中共享為 'Square',對於所有 CircleShape 物件,則為 'Circle'。
結論
多重繼承特性從不同的物件獲取多個特性並將其分配給當前物件。在一些純面向物件的語言中,我們可以將多個父類分配給某個物件,以便它們可以同時獲取這些父類的屬性。在 JavaScript 中,這個想法是類似的,但實現方法略有不同。JavaScript 不是完全面向物件的語言,因此應用了不同的方法來模擬系統中的多重繼承特性。
資料結構
網路
關係型資料庫管理系統
作業系統
Java
iOS
HTML
CSS
Android
Python
C 程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP