簡體   English   中英

Javascript原型繼承和對象構造函數

[英]Javascript prototype inheritance and Object Constructor

我有以下用於學習JS的代碼。

function CircleArea(x)
{
   this.x = x;
}

CircleArea.prototype = 
{  
   area: function () {
       return 22 / 7 * this.x * this.x;
   }
};

var CalArea = new CircleArea(7);
if( CalArea.constructor === CircleArea.prototype.constructor)
{
   alert(CalArea.area());
}

我通過將對象文字分配給CircleArea.prototype來取消繼承鏈的耦合,然后使用CircleArea構造函數定義CalArea對象。 現在,CalArea.constructor和CircleArea.prototype.constructor基本上都是對象構造函數,而不是CircleArea構造函數,但是當我在警報函數中調用CalArea.area()時,this.x獲得7作為其值,而值7作為參數傳遞給CircleArea構造函數而不是CalArea.constructor和CircleArea.prototype構造函數現在引用的Object構造函數。

我不確定“分離繼承鏈”是什么意思,但是對我來說,您正在體驗的是預期的行為。

您在CircleArea實例上調用area()

area()使用this.x

this在這方面是你的實例CircleAreax=7

所以你的計算是22 / 7 * 7 * 7

如果您期望有所不同,能否解釋您期望什么以及為什么期望它?


我猜您的困惑源於this ,后者被設置為調用函數的對象實例,因此調用CalArea.area()意味着將this設置為CalArea因此this.xCalArea.x相同

將對象分配給原型時(CircleArea.prototype = {area:fun ..}),您只需調度默認的CircleArea.prototype,因此也調度了CircleArea.prototype.constructor。 但是,當您使用new運算符時,CircleArea仍然是構造函數,它返回CircleArea的對象實例({x:自變量, proto :{area:fun, proto :...}})。 您只是不能使用新的CalArea.constructor(),而可以使用新的CircleArea()。 新的CalArea.constructor()返回Object實例

暫無
暫無

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

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