繁体   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