[英]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.