我有以下用于学习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基本上都是Object构造函数而不是CircleArea构造函数,但是当我在alert函数中调用CalArea.area()时,this.x获取7作为其值,而值7作为参数传递给CircleArea构造函数而不是CalArea.constructor和CircleArea.prototype构造函数现在引用的Object构造函数。
答案 0 :(得分:0)
我不确定你的意思是"将继承链脱钩了#34;但对我来说,你所经历的是预期的行为。
您在area()
的实例上致电CircleArea
。
area()
使用this.x
。
this
是CircleArea
x=7
的实例。
所以你的计算是22 / 7 * 7 * 7
如果你期待不同的东西,你能解释一下你的期望和期望吗?
我猜你的混淆源于this
,它被设置为调用函数的对象实例,因此调用CalArea.area()
意味着this
设置为{{1}因此CalArea
与this.x
答案 1 :(得分:0)
当您将对象分配给原型时(CircleArea.prototype = {area:fun ..}),您只需调度默认的CircleArea.prototype,因此也会调度CircleArea.prototype.constructor。但当使用operator new时,CircleArea仍然是构造函数,它返回CircleArea的对象实例({x:argument, proto :{area:fun, proto :...} })。 你不能使用新的CalArea.constructor()但可以使用新的CircleArea()。 new CalArea.constructor()返回Object实例