0

我提到this問題/答案,以瞭解原型繼承。Javascript:爲什麼使用定義繼承的原型方法,如果沒有它可以實現繼承?

我知道要擴展一個方法,我們需要在基類中定義Person.prototype.getName。因此,在子類可以在答案被稱爲myCustomer.sayMyName();

代碼可以概括如下:

function Customer(name) { 
 
     this.firstName = name; 
 
    }; 
 
    function User() { 
 
     
 
    } 
 

 
    Customer.prototype.hi = function() { 
 
     console.log('Test method of parent'); 
 
    } \t 
 

 
    User.prototype = new Customer('shaadi'); 
 
    var myUser = new User(); 
 
    myUser.hi();

但問題是,如果我可以調用與以下語法相同,爲什麼我應該使用原型

我的代碼:

function Customer(name) { 
 
     this.firstName = name; 
 
     this.hi= function() { 
 
      console.log('Test method of parent'); 
 
     } \t 
 
    }; 
 
    function User() { 
 
     
 
    } 
 
    User.prototype = new Customer('shaadi'); 
 
    var myUser = new User(); 
 
    myUser.hi();

我可以用父母的方法沒有定義Customer.prototype.hi,那麼爲什麼/時,應Customer.prototype.hi使用?

如果兩種解決方案都使我能夠訪問父母的方法,爲什麼我應該選擇前者?

回答

2

這對內存的使用情況..

在你第二個例子中的對象的每個實例都會有它的功能喜自己的副本()..

通過將功能喜()的原型,只有一個函數實例。如果您創建了成千上萬個這樣的對象,則會大量節省內存使用量。

0

前者的內存使用情況要好得多,因爲該方法僅定義一次。

函數在每個實例上聲明的第二個示例。

此外,可以修改/覆蓋原型方法,並將更改繼承到每個正在使用的實例中。

例如

function Customer(name) { 
    this.firstName = name; 
}; 
function User() { 

} 

Customer.prototype.hi = function() { 
    console.log('Test method of parent'); 
} 

User.prototype = new Customer('shaadi'); 
var myUser = new User(); 
Customer.prototype.hi = function() { 
    console.log('New Test method of parent'); 
} 
myUser.hi(); 

上述原型函數調用這兩個自定義和用戶類別後改變,但它仍然變化採取所有實例的影響。

0

你的兩個例子是非常接近在功能上等價。所不同的也許是最好的一個比喻解釋說:

假設你有一個目錄樹A,並要其他目錄B & C內顯示其文件。你可以去兩個方面看:

  1. 複製A及其所有內容的地方到BC,因此具有在A數據的3個獨立的副本。

  2. BC之間設置鏈接到AA中的數據只存在一次,但它也可以從BC訪問和查看。

在第二種情況下,這也意味着在A改變一個文件將顯示在BC這種變化,同更改原型屬性會影響類的所有實例。