2015-06-15 93 views
0

我有以下一段代码用于学习JS。Javascript原型继承和对象构造函数

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

相关:[为什么要设置原型构造?(http://stackoverflow.com/questions/8453887/why-is-it-necessary-to- set-the-prototype-constructor) –

+3

你的问题是什么? –

+0

问题是何时CalArea构造函数和CircleArea原型构造函数引用Object构造函数如何调用CalArea对象上的area()方法获取this.x = 7.虽然将值7传递给CircleArea构造函数而不是Object构造函数? – user2913184

回答

0

我不确定“解耦继承链”是什么意思,但对我来说,你正在经历的是预期的行为。

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

area()使用this.x

this在这种情况下,您的CircleArea的实例有x=7

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

如果你期望不同的东西,你能解释一下你期待什么,以及为什么你期待吗?


我猜测,你的困惑,从被设置为对象实例,一个函数被调用,所以叫CalArea.area()this茎意味着this设置为CalArea所以this.x相同CalArea.x

+0

嗯,我还挺知道你的观点是什么,但我的困惑是,当CalArea.constructor为对象构造不CircleArea构造函数是怎么来传递给CircleArea构造一种说法是提供价值为对象CalArea其构造函数对象不CircleArea – user2913184

+1

@ user2913184:我建议你设置'CircleArea.prototype.constructor =函数foo(){}',** **后您创建'CalArea',然后有看'CalArea.constructor'。根据你的逻辑,'CalArea'应该由'Foo'构造,但我们都知道情况并非如此。 'CalArea.constructor'只是指'CircleArea.prototype.constructor',并且该值在构造对象本身时不起作用。 –

+0

所以你的意思,虽然CalArea构造将是富构造函数,但它实际上起着CalArea itslef建设任何部分。我是对的先生? – user2913184

0

当您将对象分配给原型(CircleArea.prototype = {area:fun ..})时,您只需调度默认的CircleArea.prototype,然后调度CircleArea.prototype.constructor。但CircleArea仍然是构造函数,当您使用operator new时,它会返回CircleArea的对象实例({x:argument,proto:{area:fun,proto:...}})。 您只能使用新的CalArea.constructor(),但可以使用新的CircleArea()。新CalArea.constructor()返回对象实例