[英]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
在這方面是你的實例CircleArea
有x=7
。
所以你的計算是22 / 7 * 7 * 7
如果您期望有所不同,能否解釋您期望什么以及為什么期望它?
我猜您的困惑源於this
,后者被設置為調用函數的對象實例,因此調用CalArea.area()
意味着將this
設置為CalArea
因此this.x
與CalArea.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.