簡體   English   中英

了解原型 inheritance (Javascript)

[英]Understanding Prototypal inheritance (Javascript)

我試圖了解原型 inheritance 在 Javascript 中使用構造函數時的工作原理。 以下面的代碼為例:

let Animal = function (name, species, birthYear) {
  this.name = name;
  this.species = species;
  this.birthYear = birthYear;
};

let spike = new Animal(`Spike`, `Dog`, 2000);

Animal.prototype.calculateAge = function () {
  let age = 2022 - this.birthYear;
  return age;
};

Animal.prototype.color = `brown`;

spike.calculateAge();
console.log(spike.color);
console.log(spike);

最后三行是我難以理解的。 如果我的解釋在任何時候被誤導,請告訴我。

我可以在尖峰 object 上調用 calculateAge() 方法,因為它繼承了 Animal 原型的方法。 同樣,我可以將尖峰顏色屬性記錄到控制台,因為尖峰 object 繼承了動物原型的顏色屬性。 當我使用 console.log() 檢查尖峰 object 時,它具有我定義的名稱、物種和出生年份的屬性,但也有一個原型。 這是否意味着尖峰 object 包含原型,或者這只是識別它繼承了上述方法和屬性的原型? 另外,我真的不覺得我理解這個 Animal 原型是什么。 我知道代碼可以工作,一切都很好,但是這個動物原型到底是什么? 它本身是它自己的 object 嗎?

感謝您提供的任何解釋。

我想你應該首先深入了解Javascript背后的面向object的范式。

Javascript 是一種基於原型的 object 面向編程語言。

操作以原型語言編碼在原型數據結構中,並在運行時復制和更新。 然而,當抽象地觀察時,對於具有相同 state 空間和方法的所有對象,class 仍然是等價的 class。 當您向原型添加方法時,您實際上是在創建一個新的等價元素 class。

那么,你為什么要這么做? 主要是因為它產生了一個簡單、合乎邏輯和優雅的運行時系統。 要創建新的 object 或 class,只需進行深度復制,即復制所有數據以及原型數據結構。 然后你幾乎沒有得到 inheritance 和多態性:方法查找總是需要從字典中按名稱請求方法實現。

更具體地說,JavaScript 是一種基於原型的面向對象語言,這意味着它沒有類,而是使用構造函數定義行為,然后可以使用原型重用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM