Javascript原型继承和Object Constructor

时间:2015-06-15 02:00:31

标签: javascript

我有以下用于学习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构造函数。

2 个答案:

答案 0 :(得分:0)

我不确定你的意思是"将继承链脱钩了#34;但对我来说,你所经历的是预期的行为。

您在area()的实例上致电CircleArea

area()使用this.x

该上下文中的

thisCircleArea x=7的实例。

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

如果你期待不同的东西,你能解释一下你的期望和期望吗?

我猜你的混淆源于this,它被设置为调用函数的对象实例,因此调用CalArea.area()意味着this设置为{{1}因此CalAreathis.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实例